使用PIL处理截断的图像

ap0*_*ap0 5 python jpeg image python-imaging-library

我正在尝试使Python 2.7 PIL库与JPEG图像一起使用,这些JPEG图像仅作为来自HDD图像的流提供,并且不完整。

我已经设置了选项:

ImageFile.LOAD_TRUNCATED_IMAGES = True
Run Code Online (Sandbox Code Playgroud)

并尽可能地加载流(或者更好地说:据我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]
Run Code Online (Sandbox Code Playgroud)

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

问题:PIL无法在这里尝试吗?

几周前,我只是通过使用编辑器从图像文件中剪切数据来对自己截断的图像文件进行了尝试。它适用于可用的像素数据。一旦达到我要切断的像素,程序就会引发异常(我将在今天晚些时候再次尝试以确保我不会记错)。

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

编辑: 我再次尝试过,这就是我所看到的。

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

  • 我将图像稍大一点,使得图像的下部4/5不可见,但这足以让PIL向我显示可用的RGB值。其他一切都是(0,0,0)。

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

Hug*_*lle -2

我不太了解流媒体,但我认为您根本无法像您那样访问 rgb 值。尝试:

rgb_im = img.convert('RGB')
r, g, b = rgb_im.getpixel((i, j))
Run Code Online (Sandbox Code Playgroud)