提示:每个人遇到的情况都有所不同,方法仅供参考
前言
本人在使用cv2.imread读取图片时遇到Premature end of JPEG file问题,虽然这个问题并不会中断训练,但是很烦人。我翻遍了博客都没有找到解决方法,最后借助img.save函数解决了问题,于是写成博客供后面遇到此问题的朋友们参考。

1.主流解决方法
这是我在网上看到的两个主流解决方法,但是并没有解决我的问题,不过我也将代码贴出来供大家参考。
def is_image_valid1(image_path):
try:
with Image.open(image_path) as img:
img.verify() # 验证图像文件是否完整
print(f"文件 {image_path} 读取成功,格式: {img.format}, 尺寸: {img.size}")
except Exception as e:
print(f"文件 {image_path} 可能损坏: {str(e)}")
def is_image_valid2(image_path):
img = cv2.imread(image_path)
if img is None:
print(f"Image {image_path} is corrupted or cannot be read.")
return False
else:
return True
在使用cv2.imread读取损坏图片时返回值并不是None,所以这个方法没有解决我的问题。
2.img.save解决方法如下
需要使用到os库和PIL库,其中folder_path是图片所在的文件夹,output_folder是复制图片保存的路径,log_file是日志文件输出路径。
import os
from PIL import Image
def re_save(folder_path, output_folder, log_file='error_log.txt'):
# 检查输出文件夹是否存在,不存在则创建
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 打开日志文件,准备写入错误信息
with open(log_file, 'a') as log:
for file_name in os.listdir(folder_path):
file_path = os.path.join(folder_path, file_name)
try:
with Image.open(file_path) as img:
# 重新保存图像到新的文件夹
img.save(os.path.join(output_folder, file_name))
# 如果图片数量很多的话建议注释下一行代码
print(f"文件 {file_name} 已重新保存")
except Exception as e:
# 将错误信息写入日志文件
log.write(f"文件 {file_path} 重新保存时出错: {str(e)}\n")
print(f"文件 {file_path} 重新保存时出错: {str(e)}")
# 根据自己的文件路径调用函数
re_save(fnames, output_pathh,'error_log.txt')
调用程序后的输出为

我们跟着文件路径找到损坏图片后再将损坏图片删除或者修复即可

结尾
小白第一次写文章,实力有限请见谅,如果方法对你有帮助的话别忘记点个赞
2352

被折叠的 条评论
为什么被折叠?



