Python 如何用负值保存PIL图像

Python 如何用负值保存PIL图像,python,image,image-processing,python-imaging-library,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

我正在尝试使用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格式不支持这种模式(尽管在模式
'I'
中编写图像时不会抛出错误)。但是,
.tif
扩展似乎:

img1.save("test_file.tif")
更改该选项(以及读取以获得正确的文件)似乎有效:

原始最小值-993,最大值:990
PIL最小值-993,最大值:990
img_文件最小-993,最大:990

如果可以用负值保存图像,打开图像会是什么样子?如果(255255)是白色,(0,0,0)是黑色,那么(-1000,-1000,-1000)是什么?四负白色?图像的颜色是由一个或多个8位无符号整数组成的定义像素,因此无法创建一个包含值超出范围0..255的像素。您需要将结果缩放到此范围以保持它们。PIL确实支持更大的范围,例如0..4095,因此您可以更精确地保存数据。我还认为它支持正浮点值,但从未尝试过。大多数浏览器只允许0-255,图像通常没有这个限制。谢谢,这很有效。顺便说一句,这里有一个很好的链接,描述了数据类型及其范围。请注意,如果要保存多通道图像(如RGB图像),此操作将失败。当
size=[10,10,3]
时,
img1.save(“test_file.tif”)
失败!