2016-07-26 63 views
2

我试图保存使用PIL负值的图像,但是,节约,该图像文件后已全部负值修剪0如何保存PIL图像负值

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 

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

+4

如果你能保存图像负值,如果你打开它,它会是什么样子?如果(255,255,255)是白色并且(0,0,0)是黑色,那么(-1000,-1000,-1000)是什么?四重负白色? – Kevin

+0

图像的颜色是由一个或多个8位_unsigned_整数组成的定义像素,因此无法创建一个具有值在0..255范围之外的值的像素。您需要将结果缩放到此范围以维护它们。 PIL确实支持更大的范围,例如0..4095,所以您可以更精确地保存数据。我也认为它支持正浮点值,但从未尝试过。 – martineau

+0

大多数浏览器只允许0-255,图像一般不会有这个限制。 –

回答

2

请注意,根据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 
+0

谢谢,这个作品。 BTW这里是描述数据类型及其范围的好链接。 http://scikit-image.org/docs/dev/user_guide/data_types.html –