我知道JPEG壓縮是有損的。 我有2個問題:重新編碼JPEG圖像是冪等操作嗎?
發出的操作T:
1.取JPEG-80圖像
2.解碼到一個字節緩衝器
3.編碼給定字節緩衝液作爲JPEG-80
在視覺質量方面,T是冪等操作嗎? 或者當我重複T時,圖像質量是否會降低? 這對JPEG-XR編解碼器也適用嗎?
謝謝!
編輯: 由於曾經存在相互矛盾的答案,這將是巨大的,如果你能提供參考!
我知道JPEG壓縮是有損的。 我有2個問題:重新編碼JPEG圖像是冪等操作嗎?
發出的操作T:
1.取JPEG-80圖像
2.解碼到一個字節緩衝器
3.編碼給定字節緩衝液作爲JPEG-80
在視覺質量方面,T是冪等操作嗎? 或者當我重複T時,圖像質量是否會降低? 這對JPEG-XR編解碼器也適用嗎?
謝謝!
編輯: 由於曾經存在相互矛盾的答案,這將是巨大的,如果你能提供參考!
如果您使用相同設置的相同JPG壓縮引擎,它通常是冪等的。我不知道這是否有保證,但我認爲大多數實現都會照顧它。我確實知道Java運行時的實現碰巧是冪等的。
我正在使用WIC API:http://msdn.microsoft.com/en-us/library/windows/desktop/gg430027(v=vs.85).aspx – Sau 2013-02-12 22:02:47
我假設Dave試圖重新編碼JPEG圖像,而沒有首先將它轉換爲位圖,所以這個證據不是很有說服力。我對任何API都不熟悉,但我懷疑Dave使用的Java JPEG編碼器實現可能「足夠聰明」,如果它記得先前編碼過它,就不會*重新編碼JPEG圖像。畢竟,重新編碼一個JPEG通常是不需要的,所以API可以容忍這個函數潛在的普遍濫用,儘管它可能會拋出一個警告,要清楚「在引擎蓋下發生了什麼」 「。 – StockB 2013-09-19 13:48:09
根據定義,有損操作通過以最終用戶不理解的方式簡化表示來丟棄數據。然而,編碼器沒有用於確定哪些像素重要且哪些不重要的神奇方法,因此它對所有像素進行均等編碼,即使它們是僞像!
換句話說,編碼器會將損失壓縮的圖像視爲無損圖像。有損圖像將進一步簡化,丟棄該過程中的附加數據,因爲對於所有編碼器都知道,用戶意圖來表示僞像。
這裏是JPEG代損失的一些例子:
它不能保證,但它可能發生。特別是如果您重複編碼 - >解碼 - >編碼 - >解碼過程足夠多的時間,它最終會解決一個固定點,並進一步停止質量丟失(只要您堅持相同的質量和相同的編碼器)。
JPEG編碼在幾個步驟來完成:
而解碼是相同的過程倒退。
步驟1和步驟2有四捨五入誤差(特別是在使用整數數學的速度優化編碼器中),所以對於冪等重新編碼,您需要很幸運能夠使編碼和解碼舍入誤差變小或相互抵消。
步驟3是主要的有損步驟,實際上是冪等的。如果您的解碼像素轉換爲類似的DCT,它將再次量化爲相同的數據!
JPEG XR也使用YUV,所以它可能會遭受一些舍入誤差,但是OTOH而不是DCT它使用了可以計算而不捨入誤差的不同變換,所以它應該比其他的更容易往返JPEG-XR格式。
我不知道,但我不會指望它。尤其是在不同的發動即使使用單個引擎,發生的近似值在應用兩次時也可能不會導致相同的區域。 – 2013-02-12 21:11:36
我會說不。在每次編碼爲jpeg後,會有更多的「損失」。 – leppie 2013-02-13 20:28:14