使用 PIL 处理截断的图像

问题描述 投票:0回答:3

我正在尝试让 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 是不可能的吗?

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

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

编辑: 我又试了一次,这就是我所看到的。

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

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

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

python image jpeg python-imaging-library
3个回答
0
投票

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


0
投票

我也有同样的问题

Pillow==9.2.0

我们降级到

Pillow==8.3.2
就可以了。


-2
投票

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

rgb_im = img.convert('RGB')
r, g, b = rgb_im.getpixel((i, j))
© www.soinside.com 2019 - 2024. All rights reserved.