簡體   English   中英

PIL jpeg,如何保留像素顏色

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM