用PIL处理截断图像

我试图让Python 2.7 PIL Library能够处理JPEG图像,这些图像只能作为来自HDD映像的流使用,并且不完整。

我已经设置了选项:

ImageFile.LOAD_TRUNCATED_IMAGES = True

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

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不可能吗?

几个星期前,我对一个我自己截断的图像文件进行了相同的尝试,只需使用编辑器从其中剪切数据即可。 它适用于可用的像素数据。 一旦它达到我切断的像素,程序就会抛出一个异常(我今天晚些时候会再试一次,以确保我不记得错误)。

如果有人想知道为什么我这样做:我需要确保该hdd映像中的图像/图片处于连续的块/簇中,并且没有分段。 为了确保这一点,我想使用像素匹配。

编辑:我已经尝试了一遍,这就是我所看到的。

  • 我在GIMP中打开了一个截断图像,它向我展示了上部的几条像素线,但是PIL至少不能给我那些像素的RGB值。 它总是返回(0,0,0)。

  • 我将图像做得稍微大一些,使得图像的较低4/5不可见,但这足以让PIL向我展示可用的RGB值。 其他一切都是(0,0,0)。

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


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


    我真的不知道流式传输,但我认为你根本无法像你那样访问rgb价值。 尝试:

    rgb_im = img.convert('RGB')
    r, g, b = rgb_im.getpixel((i, j))
    
    链接地址: http://www.djcxy.com/p/50049.html

    上一篇: Working with truncated images with PIL

    下一篇: Correlation between two images