2

我有相同的图像,其中一张是存储在我机器上的原始图像,另一张上传到 azure blob 存储并下载回我的本地机器。这是一段代码(Python 3.6.3、Pillow-SIMD 4.3.0post0、libjpeg-turbo、ubuntu 17.10/alpine docker 容器):

image_stream = open('src/app/resize/resizer/corrupted_blob.jpg', 'rb')
image = Image.open(image_stream)
image.load()

当解释器命中 .load 方法时会引发异常:OSError: image file is truncated (6 bytes not processed)

所以它只发生在corrupted_blob.jpg,corrupted_original.jpg被正确加载和显示。我知道第一个假设是“在上传过程中发生了一些事情”,但是浏览器或 windows/ubuntu 图像查看器或另一个渲染图像的软件可以正确处理这两个图像。因此,枕头或底层 libjpeg 有一些东西。

我曾尝试使用ImageFile.LOAD_TRUNCATED_IMAGES = True,但我得到的只是一张黑色图像-_-

请帮忙!

原始图像

blob 上传/下载的图像

4

1 回答 1

0

所以经过调查,我发现由于某种原因缺少后缀 JPEG 字节。这是解决方法:

except OSError as e:
    fixed_image_bytes = image_stream.getvalue() + b'\xff\xd9'
    with io.BytesIO(fixed_image_bytes) as fixed_image_stream:
        image = Image.open(fixed_image_stream)
        image.load()
于 2018-03-16T18:18:28.543 回答