Premature end of JPEG file解决办法

该文章已生成可运行项目,

提示:每个人遇到的情况都有所不同,方法仅供参考

前言

本人在使用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')

调用程序后的输出为

在这里插入图片描述

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

在这里插入图片描述

结尾

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

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值