1. 程式人生 > >JAVA實現圖片等比縮放,圖片擷取功能--封裝類

JAVA實現圖片等比縮放,圖片擷取功能--封裝類

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; import com.gzdec.common.log.LoggerUtil; /**    * 圖片工具類,完成圖片的擷取    */   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 inFilePath 要擷取檔案的路徑        * @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      * author: cxg 2009-5-24 下午12:05:05      */     public static boolean compress(InputStream in, File saveFile, int proportion) {         if(null == in                 ||null == saveFile                 ||proportion < 1){// 檢查引數有效性             LoggerUtil.error(ImageHelper.class, "--invalid parameter, do nothing!");             return false;         }         BufferedImage srcImage = null;         try {             srcImage = ImageIO.read(in);         } catch (IOException e) {             e.printStackTrace();             return false;         }         // 原圖的大小         int width = srcImage.getWidth() / proportion;         int hight = srcImage.getHeight() / proportion;         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 {        /**         * saveSubImage 截圖類的使用         * srcImage 為BufferedImage物件         * Rectangle    為需要截圖的長方形座標         * saveFile 需要儲存的路徑及名稱         * **/         //需要截圖的長方形座標         /*Rectangle rect =new Rectangle();         rect.x=40;         rect.y=40;         rect.height=160;         rect.width=160;         InputStream in = null;         //需要儲存的路徑及名稱         File saveFile = new File("d:\\kec3.jpg");         //需要進行處理的圖片的路徑         in = new FileInputStream(new File("d:\\kec.jpg"));         BufferedImage srcImage = null;         //將輸入的資料轉為BufferedImage物件         srcImage = ImageIO.read(in);         ImageHelper img=new ImageHelper();         img.saveSubImage(srcImage, rect, saveFile);*/        /**         * compress 圖片縮放類的使用(縮圖)         * srcImage 為InputStream物件         * Rectangle    為需要截圖的長方形座標         * proportion 為壓縮比例         * **/         /*InputStream in = null;         //縮放後需要儲存的路徑         File saveFile = new File("d:\\kec2.jpg");         try {             //原圖片的路徑             in = new FileInputStream(new File("d:\\kec.jpg"));             compress(in, saveFile, 5);         } catch (Exception e) {             e.printStackTrace();         } finally {             in.close();         }*/     } }