2016-07-26 59 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 –