1. 程式人生 > >通過java進行圖片壓縮

通過java進行圖片壓縮

專案中需要將圖片進行壓縮,從而提高頁面載入速度。(本方法不改變圖片畫素,只改變圖片質量,效果還算理想!)

package ydysz.tools;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;

/**
 * 圖片壓縮
 * 畫素不變,記憶體壓縮
 * @author dellpc
 */
public class ImagecompressPic{
    public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException {
        File file = null;
        BufferedImage src = null;
        FileOutputStream out = null;
        ImageWriter imgWrier;
        ImageWriteParam imgWriteParams;

        // 指定寫圖片的方式為 jpg
        imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
        imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(
                null);
        // 要使用壓縮,必須指定壓縮方式為MODE_EXPLICIT
        imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
        // 這裡指定壓縮的程度,引數qality是取值0~1範圍內,
        imgWriteParams.setCompressionQuality((float)0.1);
        imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
        ColorModel colorModel = ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault();
        // 指定壓縮時使用的色彩模式
//        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
//                colorModel, colorModel.createCompatibleSampleModel(16, 16)));
        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
                colorModel, colorModel.createCompatibleSampleModel(16, 16)));

        try {
            if (isBlank(srcFilePath)) {
                return false;
            } else {
                file = new File(srcFilePath);
                src = ImageIO.read(file);
                out = new FileOutputStream(descFilePath);

                imgWrier.reset();
                // 必須先指定 out值,才能呼叫write方法, ImageOutputStream可以通過任何
                // OutputStream構造
                imgWrier.setOutput(ImageIO.createImageOutputStream(out));
                // 呼叫write方法,就可以向輸入流寫圖片
                imgWrier.write(null, new IIOImage(src, null, null),
                        imgWriteParams);
                out.flush();
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public static boolean isBlank(String string) {
        if (string == null || string.length() == 0 || string.trim().equals("")) {
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        try {
            ImagecompressPic.compressPic("C:\\Users\\dellpc\\Desktop\\test.jpg", "C:\\Users\\dellpc\\Desktop\\CC.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}