簡體   English   中英

壓縮jpeg以達到指定目標圖像文件大小的算法

[英]Algorithm to compress jpeg to achieve a specified target image file size

我有幾個JavaScript庫( angular-ahdinJIC ),在將其提交到后端之前,可以使用它們來壓縮用戶上傳的圖像。

我見過的所有庫都帶有質量參數,並使用jpeg壓縮來減少文件。 壓縮之前,您不知道基於任何質量值生成的圖像將是多少文件大小。

我的想法是使用“二進制搜索”類型算法嘗試不同的質量百分比,直到最終得到的圖像恰好低於目標最大文件大小。

它將以50%的jpeg質量開始。 如果壓縮的圖像在目標文件大小以下,則質量達到75%,否則質量達到25%,依此類推。 在保證的6次迭代中,它將達到目標文件大小的1%粒度,然后我停止了。

假設沒有已經具有此功能的庫,是否有比二進制搜索更好的方法? 是否有任何圖像研究表明種子價值高於50%?

二進制搜索可能足以解決您的問題,但是隱式地假設壓縮文件的大小是參數Q的線性函數,而實際上不是。 因此,可能會有更好的執行選項。

如果您有將要處理的圖像類型的代表性樣本,則可能需要計算Q函數的平均大小。 然后,您會看到最佳起點是什么,以及大小隨Q的變化而變化的速度。

無論如何,JPEG量化表通常被計算為標准IJG表的“縮放”版本。 通常將表T [i]的項縮放為Q的函數:

S = Q < 50 ? 5000/Q : 200 - 2Q
T_Q[i] = (S*T[i] + 50) / 100

因此,如果您的庫遵循此方法,則可以對Q> = 50使用二進制(線性)搜索,並對Q <50的情況采用線性搜索。

最后,如果可以使用諸如JPEG2000之類的漸進壓縮算法,則可以直接避免此問題,因為可以將目標比特率(等效於壓縮文件大小)用作參數。

由於JPEG算法的工作方式,如果輸出大小確實很關鍵,則“二進制搜索”方法是唯一可行的方法。 JPEG根本不是出於這個目的而設計的,而是使用質量設置來丟棄信息,而不是針對特定目標進行計算。

由於壓縮率會隨圖像內容和復雜度的變化而變化, 因此選擇“ 50%”並不是一個更好的選擇,您必須分析圖像以做出更好的猜測,然后您就可以對其進行壓縮了。

我在二分搜索中看到的唯一可能的改進就是使其成為分布式搜索。 因此,如果50%產生40KB,75%產生80KB,而您的目標是50KB以下,那么嘗試(50%+ floor(25 * 1/4))= 56%(而不是62.5%)是一個非常安全的選擇。 由於JPEG壓縮率不是質量設置的線性函數,但是我懷疑在現實情況下這會更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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