簡體   English   中英

通過Java縮小JPEG圖像大小而不縮放其寬度/高度

[英]Reduce JPEG image size without scale its width/height by Java

我希望通過Java減少一個jpeg圖像大小(3M減少到1M),沒有比例(圖像高度和寬度沒有變化)。 在這個網站上,我找不到解決方案。 以下是我的嘗試:

1使用ImageIO:

BufferedImage image  = ImageIO.read(inputFile);

ImageWriter writer = null;
Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
if(iter.hasNext()){
    writer = (ImageWriter) iter.next();
}

ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
writer.setOutput(ios);

ImageWriteParam iwParam = writer.getDefaultWriteParam();
iwParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwParam.setCompressionQuality(compressionQuality);
writer.write(null, new IIOImage(image, null, null ), iwParam);

對於解決方案1,我為jpg設置了compressionQuality,但是我無法獲得原始圖像compressQuality,而我得到的newImage有時比原始版本大。

使用的壓縮質量不與JPEG圖像一起存儲。

如果您需要低於某個閾值,則必須多次嘗試,同時降低壓縮質量,直到達到極限。 請注意,設置非常低會導致圖像質量不佳。

我不熟悉MODE_EXPLICIT標志。 它也可能是一個可調參數。

我找到了以下代碼示例來降低質量。

重要的是設置iwp.setCompressionQuality。 希望這會有所幫助。

BufferedImage bi = null;

bi = ImageIO.read(new File("image.jpg"));

Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = (ImageWriter) iter.next();

ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

// reduced quality.
iwp.setCompressionQuality(0.1f);

File file = new File("c:/image_low.jpg");

FileImageOutputStream output = null;

output = new FileImageOutputStream(file);

writer.setOutput(output);

IIOImage image = new IIOImage(bi, null, null);
writer.write(null, image, iwp);

writer.dispose();

暫無
暫無

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

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