使用PIL处理截断的图像

时间:2014-11-06 09:59:36

标签: python image jpeg python-imaging-library

我正在尝试使用Python 2.7 PIL库来处理JPEG图像,这些图像仅作为来自HDD映像的流可用而且不完整。

我已设置选项:

ImageFile.LOAD_TRUNCATED_IMAGES = True

并尽可能地加载流(或更好地说:只要我100%确定此数据仍然是图像,而不是其他文件类型)。我已经测试了不同的东西,据我所知(对于JPEG),PIL只有在找到0xFFDA(扫描开始标记)时才接受它作为有效的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值,即使只有视图像素数据可用。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

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

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