更换数据集导致错误OSError: Unrecognized data stream contents when reading image file

查找错误

比如我的png格式图片要一样的开头时(也就是说,文件是png,但二进制读入却是jpg)

def is_valid_image(path):
    try:
        bValid = True
        fileobj = open(path, 'rb')  # 以二进制打开文件
        buf = fileobj.read()
        if not buf.startswith(b'\x89PNG'):  # 是否以\x89PNG开头 表示PNG
            bValid = False
            print(buf)
        else:
            try:
                Image.open(fileobj).verify()
            except Exception as e:
                bValid = False
    except Exception as e:
        return False
    return bValid

jpg格式

def is_valid_image(path):
    try:
        bValid = True
        fileobj = open(path, 'rb')  # 以二进制打开文件
        buf = fileobj.read()
        if not buf.startswith(b'\xff\xd8'):  # 是否以\xff\xd8开头 表示JPEG(jpg)
            bValid = False
        else:
            try:
                Image.open(fileobj).verify()
            except Exception as e:
                bValid = False
    except Exception as e:
        return False
    return bValid

打印错误文件并查看其二进制开头

以png为例,如果不想看二进制开头可注释掉print(buf)

import os
from PIL import Image
import shutil

def is_valid_image(path):
    try:
        bValid = True
        fileobj = open(path, 'rb')  # 以二进制打开文件
        buf = fileobj.read()
        if not buf.startswith(b'\x89PNG'):  # 是否以\x89PNG开头 表示PNG
            bValid = False
            print(buf)
        else:
            try:
                Image.open(fileobj).verify()
            except Exception as e:
                bValid = False
    except Exception as e:
        return False
    return bValid

def is_call_valid(path, move_to_path):

    # 遍历图像夹下所有图像 root:根目录  dirs:根目录下所有目录(文件夹):files: 包含所有图像的一个list
    for root, dirs, files in os.walk(path):
        for img_file in files:
            # 组合图像的绝对路径
            img_file_path = os.path.join(root, img_file)
            # 调用图像判断函数
            flag = is_valid_image(img_file_path)
            # 判断图像是否损坏,若是则移动到失效文件路径中
            if flag == False:
                # this delete can not restore
                # os.remove(img_file_path)
                print(img_file_path)
                # 移动文件
                # shutil.move(img_file_path, move_to_path)
                # print(img_file_path)

# is_call_valid('./dataset/train_data/ors-4199/gt','./fail ors-4199')
is_call_valid('./dataset/train_data/RSISOD/gt','./fail RSISOD')

移动文件

import os
from PIL import Image
import shutil

def is_valid_image(path):
    try:
        bValid = True
        fileobj = open(path, 'rb')  # 以二进制打开文件
        buf = fileobj.read()
        if not buf.startswith(b'\x89PNG'):  # 是否以\x89PNG开头 表示PNG
            bValid = False
        else:
            try:
                Image.open(fileobj).verify()
            except Exception as e:
                bValid = False
    except Exception as e:
        return False
    return bValid

def is_call_valid(path, move_to_path):

    # 遍历图像夹下所有图像 root:根目录  dirs:根目录下所有目录(文件夹):files: 包含所有图像的一个list
    for root, dirs, files in os.walk(path):
        for img_file in files:
            # 组合图像的绝对路径
            img_file_path = os.path.join(root, img_file)
            # 调用图像判断函数
            flag = is_valid_image(img_file_path)
            # 判断图像是否损坏,若是则移动到失效文件路径中
            if flag == False:
                # this delete can not restore
                # os.remove(img_file_path)
                # 移动文件
                shutil.move(img_file_path, move_to_path)
                # print(img_file_path)

is_call_valid('./dataset/train_data/ors-4199/gt','./fail ors-4199')
is_call_valid('./dataset/train_data/RSISOD/gt','./fail RSISOD')

补充,将后缀是png但实际是jpg图像转换为png图像

from PIL import Image
import os

# 设置输入文件夹路径和目标格式
input_folder = './dataset/train_data/RSISOD/gt/pool'
target_format = 'png'

# 循环遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):
    # 检查文件是否为jpg格式
    fileobj = open(os.path.join(input_folder, filename), 'rb')  # 以二进制打开文件
    buf = fileobj.read()
    if not buf.startswith(b'\x89PNG'):
        # 组合新的文件名和路径
        img_path_jpg = os.path.join(input_folder, filename)
        img_path_png = os.path.splitext(img_path_jpg)[0] +'!'+ '.' + target_format

        # 读取JPG格式图片并保存为PNG格式
        with Image.open(img_path_jpg) as img:
            img.save(img_path_png)

        # 删除原始JPG格式图片
        os.remove(img_path_jpg)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醋酸洋红就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值