解决批量图像处理过程中:OSError: image file is truncated

2024-03-04 10:58

本文主要是介绍解决批量图像处理过程中:OSError: image file is truncated,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1:问题描述:

在进行图像处理过程中,批量读取图像进行处理的时候,遇到中间某个图像损坏,导致处理无法进行下去。并伴随着OSError: image file is truncated的异常。

字面自已,图像被截断,损坏,无法完成正常的读取。


2:问题分析

错误发生的代码位于python的site-package文件夹内,代码文件为 ImageFile.py 。具体代码:

    
import io
import struct
import sys
import warningsfrom . import Image
from ._util import isPathMAXBLOCK = 65536SAFEBLOCK = 1024 * 1024LOAD_TRUNCATED_IMAGES = False
"""Whether or not to load truncated image files. User code may change this."""ERRORS = {-1: "image buffer overrun error",-2: "decoding error",-3: "unknown error",-8: "bad configuration",-9: "out of memory error",
}
"""Dict of known error codes returned from :meth:`.PyDecoder.decode`."""        try:# FIXME: This is a hack to handle TIFF's JpegTables tag.prefix = self.tile_prefixexcept AttributeError:prefix = b""for decoder_name, extents, offset, args in self.tile:decoder = Image._getdecoder(self.mode, decoder_name, args, self.decoderconfig)try:seek(offset)decoder.setimage(self.im, extents)if decoder.pulls_fd:decoder.setfd(self.fp)status, err_code = decoder.decode(b"")else:b = prefixwhile True:try:s = read(self.decodermaxblock)except (IndexError, struct.error) as e:# truncated png/gifif LOAD_TRUNCATED_IMAGES:breakelse:raise OSError("image file is truncated") from eif not s:  # truncated jpegif LOAD_TRUNCATED_IMAGES:breakelse:raise OSError("image file is truncated "f"({len(b)} bytes not processed)")

从上述代码可以看出,

LOAD_TRUNCATED_IMAGES = False,此时如果读取的图像损坏,则会执行如下代码:
                     while True:try:s = read(self.decodermaxblock)except (IndexError, struct.error) as e:# truncated png/gifif LOAD_TRUNCATED_IMAGES:breakelse:raise OSError("image file is truncated") from eif not s:  # truncated jpegif LOAD_TRUNCATED_IMAGES:breakelse:raise OSError("image file is truncated "f"({len(b)} bytes not processed)")
        从这段代码可以看出,只要LOAD_TRUNCATED_IMAGES为False,则总会抛出OSError: image file is truncated的异常。这就是无法跳过损坏图片进行继续处理的原因。

3:解决办法:   

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

如果想要跳过损坏图像进行接下来的图像操作,则需要将LOAD_TRUNCATED_IMAGES的值置为True。具体操作在代码开头添加如上两行代码。

这篇关于解决批量图像处理过程中:OSError: image file is truncated的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772959

相关文章

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左