圖片工具類 圖片壓縮 截取 (copy 代碼直接可用)

import java.awt.Graphics2D;  
import java.awt.Rectangle;  
import java.awt.RenderingHints;  
import java.awt.geom.AffineTransform;  
import java.awt.image.BufferedImage;  
import java.awt.image.ColorModel;  
import java.awt.image.WritableRaster;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStream;  
  
import javax.imageio.ImageIO;  
  
  
/** 
 * 圖片工具類 
 * @author hxw
 * @description 圖片壓縮 截取 
 * 
 */  
public class ImageHelper {  
    /** 
     * 實現圖像的等比縮放 
     *  
     * @param source 
     * @param targetW 
     * @param targetH 
     * @return 
     */  
    private static BufferedImage resize(BufferedImage source, int targetW, int targetH) {  
        // targetW,targetH分別表示目標長和寬  
        int type = source.getType();  
        BufferedImage target = null;  
        double sx = (double) targetW / source.getWidth();  
        double sy = (double) targetH / source.getHeight();  
        // 這裏想實現在targetW,targetH範圍內實現等比縮放。如果不需要等比縮放  
        // 則將下面的if else語句註釋即可  
        if (sx < sy) {  
            sx = sy;  
            targetW = (int) (sx * source.getWidth());  
        } else {  
            sy = sx;  
            targetH = (int) (sy * source.getHeight());  
        }  
        if (type == BufferedImage.TYPE_CUSTOM) { // handmade  
            ColorModel cm = source.getColorModel();  
            WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);  
            boolean alphaPremultiplied = cm.isAlphaPremultiplied();  
            target = new BufferedImage(cm, raster, alphaPremultiplied, null);  
        } else  
            target = new BufferedImage(targetW, targetH, type);  
        Graphics2D g = target.createGraphics();  
        // smoother than exlax:  
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);  
        g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));  
        g.dispose();  
        return target;  
    }  
  
    /** 
     * 實現圖像的等比縮放和縮放後的截取, 處理成功返回true, 否則返回false 
     *  
     * @param inFilePath 
     *            要截取文件的路徑 
     * @param outFilePath 
     *            截取後輸出的路徑 
     * @param width 
     *            要截取寬度 
     * @param hight 
     *            要截取的高度 
     * @throws Exception 
     */  
    public static boolean compress(String inFilePath, String outFilePath, int width, int hight) {  
        boolean ret = false;  
        File file = new File(inFilePath);  
        File saveFile = new File(outFilePath);  
        InputStream in = null;  
        try {  
            in = new FileInputStream(file);  
            ret = compress(in, saveFile, width, hight);  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
            ret = false;  
        } finally {  
            if (null != in) {  
                try {  
                    in.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
  
        return ret;  
    }  
  
    /** 
     * 實現圖像的等比縮放和縮放後的截取, 處理成功返回true, 否則返回false 
     *  
     * @param in 
     *            要截取文件流 
     * @param outFilePath 
     *            截取後輸出的路徑 
     * @param width 
     *            要截取寬度 
     * @param hight 
     *            要截取的高度 
     * @throws Exception 
     */  
    public static boolean compress(InputStream in, File saveFile, int width, int hight) {  
        // boolean ret = false;  
        BufferedImage srcImage = null;  
        try {  
            srcImage = ImageIO.read(in);  
        } catch (IOException e) {  
            e.printStackTrace();  
            return false;  
        }  
  
        if (width > 0 || hight > 0) {  
            // 原圖的大小  
            int sw = srcImage.getWidth();  
            int sh = srcImage.getHeight();  
            // 如果原圖像的大小小於要縮放的圖像大小,直接將要縮放的圖像複製過去  
            if (sw > width && sh > hight) {  
                srcImage = resize(srcImage, width, hight);  
            } else {  
                String fileName = saveFile.getName();  
                String formatName = fileName.substring(fileName.lastIndexOf('.') + 1);  
                try {  
                    ImageIO.write(srcImage, formatName, saveFile);  
                } catch (IOException e) {  
                    e.printStackTrace();  
                    return false;  
                }  
                return true;  
            }  
        }  
        // 縮放後的圖像的寬和高  
        int w = srcImage.getWidth();  
        int h = srcImage.getHeight();  
        // 如果縮放後的圖像和要求的圖像寬度一樣,就對縮放的圖像的高度進行截取  
        if (w == width) {  
            // 計算X軸座標  
            int x = 0;  
            int y = h / 2 - hight / 2;  
            try {  
                saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);  
            } catch (IOException e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
        // 否則如果是縮放後的圖像的高度和要求的圖像高度一樣,就對縮放後的圖像的寬度進行截取  
        else if (h == hight) {  
            // 計算X軸座標  
            int x = w / 2 - width / 2;  
            int y = 0;  
            try {  
                saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);  
            } catch (IOException e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
  
        return true;  
    }  
  
    /** 
     * 實現圖像的等比縮放和縮放後的截取, 處理成功返回true, 否則返回false 
     *  
     * @param in 
     *            圖片輸入流 
     * @param saveFile 
     *            壓縮後的圖片輸出流 
     * @param proportion 
     *            壓縮後寬度 
     * @throws Exception 
     */  
    public static boolean compress(InputStream in, File saveFile, float compress_width) {  
        if (null == in || null == saveFile || compress_width < 1) {// 檢查參數有效性  
            // LoggerUtil.error(ImageHelper.class, "--invalid parameter, do  
            // nothing!");  
            return false;  
        }  
  
        BufferedImage srcImage = null;  
        double multiple = 1.0d;  
        try {  
            srcImage = ImageIO.read(in);  
            int original_width = srcImage.getWidth(); // 原始寬度  
            if (original_width > compress_width) {  
                multiple = original_width / compress_width; // 計算要達到指定寬度要縮放的倍數  
            }  
        } catch (IOException e1) {  
            // TODO Auto-generated catch block  
            e1.printStackTrace();  
        }  
  
        // 原圖的大小  
        int width = (int) (srcImage.getWidth() / multiple);  
        int hight = (int) (srcImage.getHeight() / multiple);  
  
        srcImage = resize(srcImage, width, hight);  
  
        // 縮放後的圖像的寬和高  
        int w = srcImage.getWidth();  
        int h = srcImage.getHeight();  
        // 如果縮放後的圖像和要求的圖像寬度一樣,就對縮放的圖像的高度進行截取  
        if (w == width) {  
            // 計算X軸座標  
            int x = 0;  
            int y = h / 2 - hight / 2;  
            try {  
                saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);  
            } catch (IOException e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
        // 否則如果是縮放後的圖像的高度和要求的圖像高度一樣,就對縮放後的圖像的寬度進行截取  
        else if (h == hight) {  
            // 計算X軸座標  
            int x = w / 2 - width / 2;  
            int y = 0;  
            try {  
                saveSubImage(srcImage, new Rectangle(x, y, width, hight), saveFile);  
            } catch (IOException e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
  
        return true;  
    }  
  
    /** 
     * 實現縮放後的截圖 
     *  
     * @param image 
     *            縮放後的圖像 
     * @param subImageBounds 
     *            要截取的子圖的範圍 
     * @param subImageFile 
     *            要保存的文件 
     * @throws IOException 
     */  
    private static void saveSubImage(BufferedImage image, Rectangle subImageBounds, File subImageFile) throws IOException {  
        if (subImageBounds.x < 0 || subImageBounds.y < 0 || subImageBounds.width - subImageBounds.x > image.getWidth() || subImageBounds.height - subImageBounds.y > image.getHeight()) {  
            // LoggerUtil.error(ImageHelper.class, "Bad subimage bounds");  
            return;  
        }  
        BufferedImage subImage = image.getSubimage(subImageBounds.x, subImageBounds.y, subImageBounds.width, subImageBounds.height);  
        String fileName = subImageFile.getName();  
        String formatName = fileName.substring(fileName.lastIndexOf('.') + 1);  
        ImageIO.write(subImage, formatName, subImageFile);  
    }  
  
    public static void main(String[] args) throws Exception {  
  
        InputStream in = null;  
        // 縮放後需要保存的路徑  
        File saveFile = new File("E:/files/3_0.png");  
  
        try {  
  
            // 原圖片的路徑  
            in = new FileInputStream(new File("E:/files/gongzhang.png"));  
  
            if (compress(in, saveFile, 700)) {  
                System.out.println("圖片壓縮完成!");  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            in.close();  
        }  
    }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章