2013-03-18 109 views
3

我對JPEG有一些實驗,the doc表示「100完全禁用了JPEG量化階段」。PIL jpeg,如何保留像素顏色

但是,在保存過程中,我仍然得到了一些像素修改。這裏是我的代碼:

import Image 
red = [20,30,40,50,60,70]; 
img = Image.new("RGB", [1, len(red)], (255,255,255)) 
pix = img.load() 

for x in range(0,len(red)): 
    pix[0,x] = (red[x],255,255) 

img.save('test.jpg',quality=100) 

img = Image.open('test.jpg') 
pix = img.load() 

for x in range(0,len(red)): 
    print pix[0,x][0], 

我得到了意想不到的輸出:22 25 42 45 62 65 我應該怎麼做,以保持像素值?請注意,我也嘗試使用PHP使用imagejpeg,它給了我正確的價值,當質量= 100。

我可以用png保存,但我想知道這背後的原因,如果有任何選項來避免

回答

2

JPEG由許多不同的步驟組成,其中許多步驟會造成一些損失。通過使用僅包含紅色的示例圖像,您可能碰到了最壞的犯人 - downsampling or chroma subsampling。一半的顏色信息被丟棄,因爲人眼對亮度變化比顏色變化更敏感。

一些JPEG編碼器可以配置爲關閉子採樣,但我不認爲這是PIL的情況。無論如何,即使可以,它也不會給你一個完全無損的文件,因爲還有其他步驟會導致損失。

+2

確定在PIL中有一個子採樣的選項,我在img.save()上設置subsampling = 0,它給了我正確的20-70。爲所有紅色,綠色,藍色設置相同的值也有時會起到訣竅的作用。 – w00d 2013-03-18 17:14:41

+0

@ w00d,你能給我一個鏈接到有記錄的地方嗎?我找不到它。 – 2013-03-18 17:18:20

+0

我猜這是無證的,我在源代碼中發現它:https://bitbucket.org/effbot/pil-2009-raclette/src/cd403356263f039a4a48a1111c7f5cc38686e481/PIL/JpegImagePlugin.py?at=default#cl-437 – w00d 2013-03-18 17:21:29

1

JPEG將始終貫徹lossyness的風險,看到Is Jpeg lossless when quality is set to 100?

最好的辦法是使用另一種格式,特別是如果你的實驗是爲了科學:)即使你不得不以JPEG開始(這看起來不太可能),你應該立即轉換爲任何形式的分析的無損格式和修改。

如果你真的想嘗試使用python進行無損JPEG工作,你可以嘗試jpegtran, "the lossless jpeg image transformation software from the Independent Jpeg Group",但作爲@Mark筆記,這不會讓你走得很遠。

順便說一句,在量化有損或無損壓縮用於相似,所以我的猜測是,

... 100完全禁用JPEG量化階段。 [1]

只是意味着它不是壓縮的。

+2

你可以用'jpegtran'做的事情非常有限。 – 2013-03-18 16:03:43