[英]PIL jpeg, how to preserve the pixel color
我對 JPEG 進行了一些實驗,文檔說“100 完全禁用 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
我應該怎么做才能保留像素值? 請注意,我還嘗試使用imagejpeg使用 PHP,當質量 = 100 時它給了我正確的值。
我可以使用png
來保存,但我想知道這背后的原因以及是否有任何選擇可以避免
JPEG 將始終存在有損風險,請參閱當質量設置為 100 時 Jpeg 是否無損? .
最好的選擇是使用另一種格式,特別是如果您的實驗是為了科學:) 即使您被迫從 JPEG 開始(這似乎不太可能),您也應該立即轉換為無損格式以進行任何類型的分析和修改。
如果您真的想嘗試使用 python 進行無損 JPEG 工作,您可以嘗試jpegtran
,“來自 Independent Jpeg Group 的無損 jpeg 圖像轉換軟件” ,但正如 @Mark 所指出的,這不會讓您走得太遠。
順便說一句,量化用於有損或無損壓縮,所以我的猜測是
...100 完全禁用 JPEG 量化階段。 [1]
只是意味着它根本沒有被壓縮。
JPEG 由許多不同的步驟組成,其中許多會引入一些損失。 通過使用僅包含紅色的示例圖像,您可能遇到了最嚴重的違規行為 -下采樣或色度二次采樣。 一半的顏色信息被丟棄,因為眼睛對亮度變化比對顏色變化更敏感。
一些 JPEG 編碼器可以通過設置subsampling=0
配置為關閉子采樣,包括 PIL 和 Pillow。 無論如何,它不會給你一個完全無損的文件,因為還有其他步驟會引入損失。
相信我已經弄清楚如何保持當前的顏色二次采樣和其他質量細節:
from PIL import Image, JpegImagePlugin as JIP
img = Image.open(filename)
img.save(
filename + '2.jpg', # copy
format='JPEG',
exif=img.info['exif'], # keep EXIF info
optimize=True,
qtables=img.quantization, # keep quality
subsampling=JIP.get_sampling(img), # keep color res
)
根據https://www.exiv2.org/tags.html我發現 YCbCrSubSampling 標記未保存在 JPEG 文件的 EXIF 中:
在 JPEG 壓縮數據中,使用 JPEG 標記代替此標記。
這一定是為什么在一個看似偏僻的地方有另一個功能可以抓住它。
(相信我在這里找到它: https ://newbedev.com/determining-jpg-quality-in-python-pil)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.