如何使用负值保存PIL图像
问题内容:
我正在尝试使用PIL保存带有负值的图像,但是,保存后,图像文件的所有负值都被裁剪为0。
from PIL import Image
import numpy as np
# generate random image for demo
img_arr = np.random.random_integers(-1000,1000, size=[10,10]).astype(np.int32)
print "original min {}, max: {}".format(img_arr.min(),img_arr.max())
# create PIL image
img1 = Image.fromarray(img_arr)
print "PIL min {}, max: {}".format(np.array(img1.getdata()).min(),np.array(img1.getdata()).max())
# save image
img1.save("test_file.png", "PNG")
# reload image
img_file = Image.open("test_file.png")
print "img_file min {}, max: {}".format(np.array(img_file.getdata()).min(),np.array(img_file.getdata()).max())
结果输出:
original min -983, max: 965
PIL min -983, max: 965
img_file min 0, max: 965
如何保存该图像并保持负值?
问题答案:
请注意,有一种事情是根据PIL将像素存储为32位带符号整数,而图像模式'I'
旨在在PIL中处理该问题。因此,由于技术原因,这种说法毫无意义,这是错误的。
我不认为PNG格式支持此模式(尽管在模式下写入Image时不会抛出任何错误'I'
)。但是,.tif
扩展名似乎是:
img1.save("test_file.tif")
更改它(并读取以获取正确的文件)似乎可行:
original min -993, max: 990
PIL min -993, max: 990
img_file min -993, max: 990