python中如何判断图片文件是否损坏及检查文件夹中的损坏图片文件

本文介绍如何使用Python的imghdr模块判断图片是否损坏,并提供代码示例,展示如何检查整个目录及其子目录中的图片文件,将损坏的图片记录在TXT文件中。
部署运行你感兴趣的模型镜像

【时间】2018.11.25

【题目】python中如何判断图片文件是否损坏及检查文件夹中的损坏图片文件

概述

     在python中,可以使用imghdr模块中的what()方法判断图片文件是否损坏,若文件损坏,则返回None,否则返回图片文件的类型,如jpeg等。imghdr模块的具体内容见: https://docs.python.org/3/library/imghdr.html,最后给出了检查文件夹及其子文件夹中的损坏文件并将结果记录在txt文件中的代码。

一、imghdr.what()源码

def what(file, h=None):

    f = None

    try:

        if h is None:

            if isinstance(file, (str, PathLike)):

                f = open(file, 'rb')

                h = f.read(32)

            else:

                location = file.tell()

                h = file.read(32)

                file.seek(location)

        for tf in tests:

            res = tf(h, f)

            if res:

                return res

    finally:

        if f: f.close()

    return None

二、imghdr.what(file, h=None)的返回值

None  ---文件损坏

三、测试

使用图01.jpg和02.jpg(损坏)进行测试

测试代码:

import imghdr

img = imghdr.what('C:\\Users\\Administrator\\Desktop\\code\\preprocess\\test\\01.jpg')

print(img)

print(type(img))

img = imghdr.what('C:\\Users\\Administrator\\Desktop\\code\\preprocess\\test\\02.jpg')

print(img)

print(type(img))

运行结果:

四、检查文件夹及其子文件夹中的损坏文件并记录在txt文件中

【代码】

import os

import imghdr

from progressbar import ProgressBar

path ='C:\\Users\\Administrator\\Desktop\\code\\preprocess\\test'

original_images =[]

for root, dirs, filenames in os.walk(path):

    for filename in filenames:

        original_images.append(os.path.join(root, filename))

original_images = sorted(original_images)

print('num:',len(original_images))

f = open('check_error.txt','w+')

error_images =[]

progress = ProgressBar()

for filename in progress(original_images):

    check = imghdr.what(filename)

    if check == None:

        f.write(filename)

        f.write('\n')

        error_images.append(filename)

print(len(error_images))

f.seek(0)

for s in f:

    print(s)

f.close()

【运行结果】

txt文件:

 

 

 

 

您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

<think> 我们正在处理一个关于OpenCV读取图片时出现损坏的问题。根据引用[2]中的错误信息,用户遇到了两个主要问题: 1. 文件无法打开或读取(cv::findDecoder imread_: can't open/read file: check file path/integrity) 2. 在尝试调整大小时出错,因为读取的图片为空(!ssize.empty() in function 'cv::resize') 错误原因分析: - 图片路径不正确或图片文件损坏。 - 在引用[2]中,用户提到文件夹损坏,并建议在Ubuntu和Windows之间传输文件时先压缩。 解决方案: 1. 检查文件路径是否正确:确保路径中的斜杠正确,并且文件名没有特殊字符或空格(尽管OpenCV通常能处理空格,但最好避免)。 2. 检查文件是否损坏:可以尝试用其他图片查看器打开图片,确认图片是否完好。 3. 在读取图片后,检查返回的image对象是否为空(None),然后再进行后续操作。 4. 在跨平台传输文件时,使用压缩文件(如zip)以避免文件损坏。 根据用户提供的代码示例(引用[1]),我们可以这样改进: - 在读取图片后,使用条件判断检查是否成功读取,如果失败则删除或跳过。 改进代码示例: ```python import os import cv2 # 图片文件夹路径 filedir = os.getcwd() + '/bg_img' # 获取文件夹下所有图片的名字 photonames = os.listdir(filedir) for photo in photonames: # 图片路径 photodir = os.path.join(filedir, photo) # 使用cv2.imread读取图片 image = cv2.imread(photodir) # 检查图片是否读取成功 if image is None: print(f"无法读取图片:{photodir}") # 可以选择删除损坏图片 # os.remove(photodir) else: try: # 显示图片 cv2.imshow("img", image) # 等待按键,然后关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows() except Exception as e: print(f"显示图片时出错:{e}") # 如果显示失败,也可以考虑删除 # os.remove(photodir) ``` 重要提示: - 使用`os.path.join`来构建路径,避免手动拼接路径带来的问题(比如不同操作系统的路径分隔符差异)。 - 在读取图片后,一定要检查`image`是否为`None`,如果是,则说明读取失败。 - 在显示图片后,使用`cv2.waitKey(0)`等待用户按键,然后关闭窗口。否则窗口会一闪而过。 另外,引用[3]提到了使用`cv::Mat`(在Python中即`cv2`返回的numpy数组)的好处,我们这自然使用了这种现代方式。 如果问题仍然存在,建议用户: - 检查文件路径的权限。 - 确保文件没有正在被其他程序占用。 - 尝试用绝对路径读取图片,排除相对路径的问题。 最后,关于跨平台传输文件,确实应该先压缩再传输,以避免损坏。 现在,我们生成相关问题: 1. 如何检查OpenCV读取的图片是否为空? 2. 在OpenCV中,如何处理读取图片时的路径问题? 3. 除了删除损坏文件,还有哪些处理损坏图片的方法? </think> ### 解决 OpenCV 读取图片显示损坏的完整方案 当使用 `cv2.imread()` 读取文件夹图片时出现损坏提示,通常由以下原因导致,以下是系统排查方法和解决方案: #### 1. **文件路径问题(最常见)** ```python import os import cv2 filedir = '/path/to/your/images' # 替换为实际路径 photonames = os.listdir(filedir) for photo in photonames: # 使用 os.path.join 避免路径拼接错误 photodir = os.path.join(filedir, photo) # 检查文件是否存在 if not os.path.exists(photodir): print(f"⚠️ 文件不存在: {photodir}") continue image = cv2.imread(photodir) # 验证是否读取成功 if image is None: print(f"❌ 读取失败: {photodir}") else: print(f"✅ 成功读取: {photo} 尺寸: {image.shape}") ``` **关键点**: - 使用 `os.path.exists()` 验证文件是否存在 - 用 `os.path.join()` 代替字符串拼接路径 - 检查 `cv2.imread()` 返回值是否为 `None` #### 2. **文件损坏问题(跨平台传输常见)** ```python # 用二进制模式验证文件完整性 for photo in phototonames: photodir = os.path.join(filedir, photo) try: # 尝试用PIL验证 from PIL import Image Image.open(photodir).verify() except Exception as e: print(f"🛑 文件损坏: {photo} - {str(e)}") os.remove(photodir) # 删除损坏文件 ``` **解决方案**: 1. 重新从源端**压缩后传输文件**(避免直接复制文件夹) 2. 使用校验工具检查文件哈希值 3. 批量重命名文件(避免特殊字符) #### 3. **OpenCV 兼容性问题** ```python # 尝试多种解码方式 image = cv2.imread(photodir, cv2.IMREAD_UNCHANGED) # 方式1 image = cv2.imdecode(np.fromfile(photodir, dtype=np.uint8), -1) # 方式2(中文路径适用) ``` **特殊处理**: - 中文路径:使用 `imdecode()` + `np.fromfile()` - CMYK格式图片:先转换为RGB - 超大分辨率图片:先缩放再读取 #### 4. **完整解决方案代码** ```python import os import cv2 import numpy as np from PIL import Image def check_images(folder): for filename in os.listdir(folder): path = os.path.join(folder, filename) # 阶段1:检查文件存在性 if not os.path.isfile(path): print(f"跳过非文件: {filename}") continue # 阶段2:检查文件完整性 try: Image.open(path).verify() except Exception as e: print(f"文件损坏: {filename} - 错误: {e}") os.remove(path) continue # 阶段3:OpenCV读取 img = cv2.imread(path) if img is None: # 尝试备用读取方式 img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_COLOR) if img is None: print(f"OpenCV读取失败: {filename}") else: # 成功读取后的处理 cv2.imshow(filename, img) cv2.waitKey(200) # 显示200ms cv2.destroyAllWindows() # 使用示例 check_images("/path/to/your/images") ``` #### 预防措施 1. **文件传输**:Windows/Linux间传输用ZIP压缩 2. **路径规范**: ```python # 推荐:使用pathlib处理路径 from pathlib import Path image_path = Path(folder) / filename ``` 3. **批量处理**:添加异常捕获 ```python try: img = cv2.imread(str(image_path)) except cv2.error as e: print(f"OpenCV错误: {e}") ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值