等比壓縮圖檔
上傳新聞時,為了避免圖檔太大,需要等比壓縮圖檔,适當壓縮并不影響圖檔在浏覽器中展示。一般建議不超過500k。
- 示例代碼
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
public class DipUtil {
/**
* 自動壓縮圖檔,總大小不超過500k
* @param source
* @param target
* @throws IOException
*/
public static void compressInLimit(File source,File target) throws IOException{
long sourceSize = source.length();
float ratio = (float) Math.log10(sourceSize/);
if (ratio <= )
ratio = f;
else if (ratio > && ratio < )
ratio = -((sourceSize/)/)*f;
else
ratio = (sourceSize/)/;
System.out.println(ratio);
BufferedImage bufferedImage = ImageIO.read(source);
OutputStream outputStream = new FileOutputStream(target);
// 建構ImageWriter
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
writer.setOutput(ios);
// 設定參數
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(ratio);
writer.write(null, new IIOImage(bufferedImage, null, null), param);
outputStream.close();
ios.close();
writer.dispose();
}
public static void main(String[] args) throws IOException {
File source = new File("e:/0139.jpg");
File target = new File("e:/0140.jpg");
compressInLimit(source,target);
}
}
-
總結
Digital Image Processing (DIP) 數字圖形處理聚焦計算機能夠開發處理圖像,輸入是數字圖像,使用有效的算法,輸出為我們想要的圖像。java提供了友善快捷的API,可以輕松實作各種圖像處理,如:灰階處理、增強、壓縮、增加邊框、高斯模糊、增加水印等。
本文僅舉例說明了壓縮,可以看出非常簡單好用。