2015-05-21 20 views
1

我開始使用枕頭image-processing,我需要使用單獨的像素。通過枕頭的Image.frombytes創建的圖像不同於預期

最後我想從字節創建圖像。因此我使用PIL.Image.frombytes(mode, size, data, decoder_name='raw', *args)函數。

你能建議數據應該是什麼嗎?

我認爲它應該是字節串像R1G1B1R2G2B2R3G3B3 ... RnGnBn爲RGB模式。

但是我有點糊塗了下列要求:

from PIL import Image 

def image_create_load_compare(initial_data): 
    img = Image.frombytes('RGB', (4, 1), initial_data) 
    img.save("temp.jpg") 

    img_loaded = Image.open("temp.jpg") 
    data_loaded = img_loaded.tobytes() 
    print("initial_data: " + str(initial_data)) 
    print("data_loaded: " + str(data_loaded)) 
    print("is initial and loaded data equal: " + str(initial_data == data_loaded)) 
    print("="*30) 

# 4 black pixels 
black_bytes = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
image_create_load_compare(black_bytes) 

# 4 white pixels 
white_bytes = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
image_create_load_compare(white_bytes) 

# 1 red pixel, 3 white pixels 
red_white_bytes = b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
image_create_load_compare(red_white_bytes) 

# 1 red pixel, 3 black pixels 
red_black_bytes = b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
image_create_load_compare(red_black_bytes) 

和輸出:

initial_data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
data_loaded: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
is initial and loaded data equal: True 
============================== 
initial_data: b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
data_loaded: b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
is initial and loaded data equal: True 
============================== 
initial_data: b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
data_loaded: b'\xda\x11\x07\xff\xe2\xe3\xf4\xfd\xff\xe0\xff\xff' 
is initial and loaded data equal: False 
============================== 
initial_data: b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
data_loaded: b'\xda\x11\x07E\x00\x00\x00\x05\x16\x00\n\x1e' 
is initial and loaded data equal: False 
============================== 

當我檢查創建的文件,有一個紅色像素和三個白色/黑色像素的圖像看起來像從紅色到白色或黑色漸變。 爲什麼來自不同顏色文件的像素與預期不同?

回答

1

JPEG是有損格式。爲了減小文件大小,它會改變像素的顏色,使其更具可壓縮性。

嘗試以無損格式保存臨時文件,例如png。

img.save("temp.png") 

img_loaded = Image.open("temp.png") 

現在你的測試應該都輸出True

initial_data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
data_loaded: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
is initial and loaded data equal: True 
============================== 
initial_data: b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
data_loaded: b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
is initial and loaded data equal: True 
============================== 
initial_data: b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
data_loaded: b'\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
is initial and loaded data equal: True 
============================== 
initial_data: b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
data_loaded: b'\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
is initial and loaded data equal: True 
==============================