或者,還有更好的庫來處理壓縮?創建JPEG時,我可以更改Java ImageWriter使用的壓縮算法嗎?
讓我以我已經理解的內容作爲序言:(1)JPEG是有損的 - 它看起來不會與輸入文件相同。 (2)我可以將壓縮質量設置調整到0.0到1.0之間,正如我在下面的代碼中所做的那樣。
我正在使用BufferedImage並將其轉換爲JPEG,並且注意到Java的ImageWriter的.write()方法爲JPEG圖像(與Photoshop「Save for Web」相比)產生了低於標準的結果。
我的代碼看起來有點像這樣現在:
// img is a BufferedImage, here
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(.75f);
IIOImage image = new IIOImage(img, null, null);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
writer.setOutput(ImageIO.createImageOutputStream(byteArrayOut));
writer.write(null, image, iwp);
writer.dispose();
與壓縮質量設置播放,但即使在設定「1.0」,他們不看一樣好東西會產生不同的質量輸出I可以在創建JPEG時使用其他工具。
由於我是一個新用戶,因此無法發佈圖像... here's a webpage that demos the differences。希望我可以在某些時候讓他們永久留在這裏,以便將來可能有類似問題的用戶使用。
很顯然,這個特定的圖像不是JPEG壓縮的最佳候選(PNG小得多且無損),但它允許更容易地看到壓縮僞像。實際的圖像本質上大都是攝影。至少,這更多的是質疑Java的JPEG壓縮算法和質量,相比之下,使用更少的字節生成更接近原始圖像的圖像。
剛剛完成了示例鏈接,對於任何曾經見過這種情況的人來說。 – timehat
理想的做法是將更好的JPEG壓縮整合到標準Java中;採取一個開源的清潔室實施(GNU/Linux libjpeg?/尤其是GNU Classpath)並將其移植到Java。也許有一些JUG的支持,這可能是可行的。 –