如何使用负值保存PIL图像

时间:2016-07-26 18:06:59

标签: python image image-processing python-imaging-library

我正在尝试使用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

如何保存此图像并保持负值?

1 个答案:

答案 0 :(得分:4)

请注意,存在根据PIL将像素存储为32位有符号整数的情况,图像模式“I”用于在PIL中处理此问题。因此,由于技术原因,这一点没有任何意义。

我不认为PNG格式支持这种模式(尽管在模式“I”中写入图像时不会抛出任何错误)。但是,“.tif”扩展似乎是:

img1.save("test_file.tif")

更改(以及读取以获取正确的文件)似乎有效:

original min -993, max: 990
PIL min -993, max: 990
img_file min -993, max: 990