python 使用PIL处理截断图像

fjnneemd  于 2023-05-05  发布在  Python
关注(0)|答案(3)|浏览(228)

我试图让Python 2.7 PIL库处理JPEG图像,这些图像只能作为来自HDD图像的流提供,并且不完整。
我设置了选项:

ImageFile.LOAD_TRUNCATED_IMAGES = True

并尽可能地加载流(或者更好地说:只要我100%确定此数据仍然是图像,而不是其他文件类型)。我已经测试了不同的东西,据我所知(对于JPEG)PIL只接受它作为一个有效的JPEG图像,如果它找到0xFFDA(开始扫描标记)。这是一个简短的例子,我如何加载数据:

from PIL import Image
from StringIO import StringIO

ImageFile.LOAD_TRUNCATED_IMAGES = True

with open("/path/to/image.raw", 'rb') as fp:
    fp.seek("""jump to position in image where JPEG starts""")
    data = fp.read("""number of bytes I know that those belong to that jpeg""")
    img = Image.open(StringIO(data)) # This would throw exception if the data does 
                                     # not contain the 0xffda marker
    pixel = img.load()               # Would throw exception if LOAD_TRUNCATED_IMAGES = false

    height,width = img.size
    for i in range(height):
        for j in range(width):
            print pixel[i,j]

在最后一行,我期望(或希望)至少看到要显示的读取像素数据。但是对于每个像素,它返回(0,0,0)

问题:我在这里尝试的是PIL不可能实现的吗?

几个星期前,我尝试了同样的方法,我自己截断了一个图像文件,只需要用编辑器剪切数据。它适用于可用的像素数据。当它到达我切断的像素时,程序抛出一个异常(我将在今天晚些时候再次尝试,以确保我没有记错)。
如果有人问我为什么要这样做:我需要确保硬盘驱动器图像中的图像/图片是连续的块/簇,而不是碎片。为了确保这一点,我想使用像素匹配。


  • 我在GIMP中打开了一个截断的图像,它在上半部分显示了一些像素线,但PIL无法至少给予我这些像素的RGB值。它总是返回(0,0,0)。
  • 我把图像稍微放大了一些,这样图像的下4/5就看不见了,但这足以让PIL向我显示可用的RGB值。其他的都是(0,0,0)。

我仍然不能100%确定PIL是否可以显示我的RGB值,即使只有视图像素数据可用。

igetnqfo

igetnqfo1#

我会尝试使用未压缩格式,如TGA。JPG是一种压缩格式,从不完整的图像中提取像素可能没有任何意义。JPEG实际上存储的是描述图像的方程的参数,而不是像素值。当您在JPEG中查询像素值时,它会在该点处计算公式并返回结果。

piwo6bdm

piwo6bdm2#

Pillow==9.2.0的问题
让我们降级到Pillow==8.3.2,它可以工作。

tquggr8v

tquggr8v3#

我真的不知道流,但我认为你根本无法访问rgb值的方式。尝试:

rgb_im = img.convert('RGB')
r, g, b = rgb_im.getpixel((i, j))

相关问题