无法将tiff PIL图像转换为字节数组

1 投票
1 回答
51 浏览
提问于 2025-04-14 16:25

我有一张.tiff格式的图片,已经加载到PIL图像库里,现在我想把它转换成字节数组。

我现在的做法是这样的:

from PIL import Image
import io

def image_to_byte_array(image: Image) -> bytes:
    imgByteArr = io.BytesIO()
    image.save(imgByteArr, format=image.format)
    imgByteArr = imgByteArr.getvalue()
    return imgByteArr

im = Image.open(r"ImagePath")
im_bytes = image_to_byte_array(im)

问题出现在我尝试把图片保存到imgByteArr的时候。

有些.tiff图片会出现设置字典时出错的提示,另外我还收到_TIFFVSetField: : 忽略标签 "OldSubfileType"(libtiff不支持)的错误信息。

有没有什么办法可以解决这些问题呢?

这里有一张示例图片

1 个回答

0

我现在有点急,但图片里有一些东西(我猜是标签、压缩或者某个属性)让你无法写入这张图片。

你可以更简单地看到产生的错误,像这样:

from PIL import Image

im = Image.open(...path...)
im.save('anything.tif')

一种去掉所有扩展属性和元数据的方法是把图片转换成一个 Numpy 数组,然后再从这个数组转换回 PIL 图片。这个通过 Numpy 的“来回转换”不能传递任何属性,只能处理像素,所以这样就可以正常工作了:

import numpy as np
from PIL import Image

im = Image.open(...path...)

# Round-trip through Numpy array to strip attributes and metadata
im = Image.fromarray(np.array(im))

im.save('anything.tif')    # works

等我有时间再深入研究一下,但这可能是一个临时的解决办法。

撰写回答