隨筆-57  評(píng)論-117  文章-1  trackbacks-0

          支持將Image的寬度、高度縮放到指定width、height,并保存在指定目錄
          通過(guò)目標(biāo)對(duì)象的大小和標(biāo)準(zhǔn)(指定)大小計(jì)算出圖片縮小的比例
          可以設(shè)置圖片縮放質(zhì)量,并且可以根據(jù)指定的寬高縮放圖片

          源碼:

          package com.hoo.util;
           
          import java.awt.Image;
          import java.awt.image.BufferedImage;
          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.net.MalformedURLException;
          import java.net.URL;
          import javax.imageio.ImageIO;
          import com.sun.image.codec.jpeg.ImageFormatException;
          import com.sun.image.codec.jpeg.JPEGCodec;
          import com.sun.image.codec.jpeg.JPEGEncodeParam;
          import com.sun.image.codec.jpeg.JPEGImageEncoder;
           
          /**
           * <b>function:</b> 縮放圖片工具類(lèi),創(chuàng)建縮略圖、伸縮圖片比例
           * @author hoojo
           * @createDate 2012-2-3 上午10:08:47
           * @file ScaleImageUtils.java
           * @package com.hoo.util
           * @blog http://blog.csdn.net/IBM_hoojo
           * http://hoojo.cnblogs.com
           * @email hoojo_@126.com
           * @version 1.0
           */
          public abstract class ScaleImageUtils {
           
              private static final float DEFAULT_SCALE_QUALITY = 1f;
              private static final String DEFAULT_IMAGE_FORMAT = ".jpg"; // 圖像文件的格式 
              private static final String DEFAULT_FILE_PATH = "C:/temp-";
              
              /**
               * <b>function:</b> 設(shè)置圖片壓縮質(zhì)量枚舉類(lèi);
               * Some guidelines: 0.75 high quality、0.5  medium quality、0.25 low quality
               * @author hoojo
               * @createDate 2012-2-7 上午11:31:45
               * @file ScaleImageUtils.java
               * @package com.hoo.util
               * @project JQueryMobile
               * @blog http://blog.csdn.net/IBM_hoojo
               * @email hoojo_@126.com
               * @version 1.0
               */
              public enum ImageQuality {
                  max(1.0f), high(0.75f), medium(0.5f), low(0.25f);
                  
                  private Float quality;
                  public Float getQuality() {
                      return this.quality;
                  }
                  ImageQuality(Float quality) {
                      this.quality = quality;
                  }
              }
              
              private static Image image;
              
              /**
               * <b>function:</b> 通過(guò)目標(biāo)對(duì)象的大小和標(biāo)準(zhǔn)(指定)大小計(jì)算出圖片縮小的比例
               * @author hoojo
               * @createDate 2012-2-6 下午04:41:48
               * @param targetWidth 目標(biāo)的寬度
               * @param targetHeight 目標(biāo)的高度
               * @param standardWidth 標(biāo)準(zhǔn)(指定)寬度
               * @param standardHeight 標(biāo)準(zhǔn)(指定)高度
               * @return 最小的合適比例
               */
              public static double getScaling(double targetWidth, double targetHeight, double standardWidth, double standardHeight) {
                  double widthScaling = 0d;
                  double heightScaling = 0d;
                  if (targetWidth > standardWidth) {
                      widthScaling = standardWidth / (targetWidth * 1.00d);
                  } else {
                      widthScaling = 1d;
                  }
                  if (targetHeight > standardHeight) {
                      heightScaling = standardHeight / (targetHeight * 1.00d);
                  } else {
                      heightScaling = 1d;
                  }
                  return Math.min(widthScaling, heightScaling);
              }
              
              /**
               * <b>function:</b> 將Image的寬度、高度縮放到指定width、height,并保存在savePath目錄
               * @author hoojo
               * @createDate 2012-2-6 下午04:54:35
               * @param width 縮放的寬度
               * @param height 縮放的高度
               * @param savePath 保存目錄
               * @param targetImage 即將縮放的目標(biāo)圖片
               * @return 圖片保存路徑、名稱
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(int width, int height, String savePath, Image targetImage) throws ImageFormatException, IOException {
                  width = Math.max(width, 1);
                  height = Math.max(height, 1);
                  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                  image.getGraphics().drawImage(targetImage, 0, 0, width, height, null);
                  
                  if (savePath == null || "".equals(savePath)) {
                      savePath = DEFAULT_FILE_PATH + System.currentTimeMillis() + DEFAULT_IMAGE_FORMAT;
                  }
                  
                  FileOutputStream fos = new FileOutputStream(new File(savePath));
                  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
                  encoder.encode(image);
           
                  image.flush();
                  fos.flush();
                  fos.close();
                  
                  return savePath;
              }
              
              /**
               * <b>function:</b> 可以設(shè)置圖片縮放質(zhì)量,并且可以根據(jù)指定的寬高縮放圖片
               * @author hoojo
               * @createDate 2012-2-7 上午11:01:27
               * @param width 縮放的寬度
               * @param height 縮放的高度
               * @param quality 圖片壓縮質(zhì)量,最大值是1; 使用枚舉值:{@link ImageQuality}
               *             Some guidelines: 0.75 high quality、0.5  medium quality、0.25 low quality
               * @param savePath 保存目錄
               * @param targetImage 即將縮放的目標(biāo)圖片
               * @return 圖片保存路徑、名稱
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(int width, int height, Float quality, String savePath, Image targetImage) throws ImageFormatException, IOException {
                  width = Math.max(width, 1);
                  height = Math.max(height, 1);
                  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                  image.getGraphics().drawImage(targetImage, 0, 0, width, height, null);
                  
                  if (savePath == null || "".equals(savePath)) {
                      savePath = DEFAULT_FILE_PATH + System.currentTimeMillis() + DEFAULT_IMAGE_FORMAT;
                  }
                  
                  FileOutputStream fos = new FileOutputStream(new File(savePath));
                  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
                  
                  JPEGEncodeParam encodeParam = JPEGCodec.getDefaultJPEGEncodeParam(image); 
                  if (quality == null || quality <= 0) {
                      quality = DEFAULT_SCALE_QUALITY;
                  }
                  /** 設(shè)置圖片壓縮質(zhì)量 */  
                  encodeParam.setQuality(quality, true);  
                  encoder.encode(image, encodeParam);  
           
                  image.flush();
                  fos.flush();
                  fos.close();
                  
                  return savePath;
              }
              
              /**
               * <b>function:</b> 通過(guò)指定大小和圖片的大小,計(jì)算出圖片縮小的合適大小
               * @author hoojo
               * @createDate 2012-2-6 下午05:53:10
               * @param width 指定的寬度
               * @param height 指定的高度
               * @param image 圖片文件
               * @return 返回寬度、高度的int數(shù)組
               */
              public static int[] getSize(int width, int height, Image image) {
                  int targetWidth = image.getWidth(null);
                  int targetHeight = image.getHeight(null);
                  double scaling = getScaling(targetWidth, targetHeight, width, height);
                  long standardWidth = Math.round(targetWidth * scaling);
                  long standardHeight = Math.round(targetHeight * scaling);
                  return new int[] { Integer.parseInt(Long.toString(standardWidth)), Integer.parseInt(String.valueOf(standardHeight)) };
              }
              
              /**
               * <b>function:</b> 通過(guò)指定的比例和圖片對(duì)象,返回一個(gè)放大或縮小的寬度、高度
               * @author hoojo
               * @createDate 2012-2-7 上午10:27:59
               * @param scale 縮放比例
               * @param image 圖片對(duì)象
               * @return 返回寬度、高度
               */
              public static int[] getSize(float scale, Image image) {
                  int targetWidth = image.getWidth(null);
                  int targetHeight = image.getHeight(null);
                  long standardWidth = Math.round(targetWidth * scale);
                  long standardHeight = Math.round(targetHeight * scale);
                  return new int[] { Integer.parseInt(Long.toString(standardWidth)), Integer.parseInt(String.valueOf(standardHeight)) };
              }
              
              public static int[] getSize(int width, Image image) {
                  int targetWidth = image.getWidth(null);
                  int targetHeight = image.getHeight(null);
                  long height = Math.round((targetHeight * width) / (targetWidth * 1.00f));
                  return new int[] { width, Integer.parseInt(String.valueOf(height)) };
              }
              
              public static int[] getSizeByHeight(int height, Image image) {
                  int targetWidth = image.getWidth(null);
                  int targetHeight = image.getHeight(null);
                  long width = Math.round((targetWidth * height) / (targetHeight * 1.00f));
                  return new int[] { Integer.parseInt(String.valueOf(width)), height };
              }
              
              /**
               * 
               * <b>function:</b> 將指定的targetFile圖片文件的寬度、高度大于指定width、height的圖片縮小,并保存在savePath目錄
               * @author hoojo
               * @createDate 2012-2-6 下午04:57:02
               * @param width 縮小的寬度
               * @param height 縮小的高度
               * @param savePath 保存目錄
               * @param targetImage 改變的目標(biāo)圖片
               * @return 圖片保存路徑、名稱
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(int width, int height, String savePath, File targetFile) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetFile);
                  int[] size = getSize(width, height, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * 
               * <b>function:</b> 將指定的targetURL網(wǎng)絡(luò)圖片文件的寬度、高度大于指定width、height的圖片縮小,并保存在savePath目錄
               * @author hoojo
               * @createDate 2012-2-6 下午04:57:07
               * @param width 縮小的寬度
               * @param height 縮小的高度
               * @param savePath 保存目錄
               * @param targetImage 改變的目標(biāo)圖片
               * @return 圖片保存路徑、名稱
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(int width, int height, String savePath, URL targetURL) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetURL);
                  int[] size = getSize(width, height, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * <b>function:</b> 將一個(gè)本地的圖片文件按照指定的比例進(jìn)行縮放
               * @author hoojo
               * @createDate 2012-2-7 上午10:29:18
               * @param scale 縮放比例
               * @param savePath 保存文件路徑、名稱
               * @param targetFile 本地圖片文件
               * @return 新的文件名稱
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(float scale, String savePath, File targetFile) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetFile);
                  int[] size = getSize(scale, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * <b>function:</b> 將一個(gè)網(wǎng)絡(luò)圖片文件按照指定的比例進(jìn)行縮放
               * @author hoojo
               * @createDate 2012-2-7 上午10:30:56
               * @param scale 縮放比例
               * @param savePath 保存文件路徑、名稱
               * @param targetFile 本地圖片文件
               * @return 新的文件名稱
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(float scale, String savePath, URL targetURL) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetURL);
                  int[] size = getSize(scale, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * <b>function:</b> 按照固定寬度進(jìn)行等比縮放本地圖片
               * @author hoojo
               * @createDate 2012-2-7 上午10:49:56
               * @param width 固定寬度
               * @param savePath 保存路徑、名稱
               * @param targetFile 本地目標(biāo)文件
               * @return 返回保存路徑
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(int width, String savePath, File targetFile) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetFile);
                  int[] size = getSize(width, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * <b>function:</b> 按照固定寬度進(jìn)行等比縮放網(wǎng)絡(luò)圖片
               * @author hoojo
               * @createDate 2012-2-7 上午10:50:52
               * @param width 固定寬度
               * @param savePath 保存路徑、名稱
               * @param targetFile 本地目標(biāo)文件
               * @return 返回保存路徑
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resize(int width, String savePath, URL targetURL) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetURL);
                  int[] size = getSize(width, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * 
               * <b>function:</b> 按照固定高度進(jìn)行等比縮放本地圖片
               * @author hoojo
               * @createDate 2012-2-7 上午10:51:17
               * @param height 固定高度
               * @param savePath 保存路徑、名稱
               * @param targetFile 本地目標(biāo)文件
               * @return 返回保存路徑
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resizeByHeight(int height, String savePath, File targetFile) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetFile);
                  int[] size = getSizeByHeight(height, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * <b>function:</b> 按照固定高度進(jìn)行等比縮放網(wǎng)絡(luò)圖片
               * @author hoojo
               * @createDate 2012-2-7 上午10:52:23
               * @param height 固定高度
               * @param savePath 保存路徑、名稱
               * @param targetFile 本地目標(biāo)文件
               * @return 返回保存路徑
               * @throws ImageFormatException
               * @throws IOException
               */
              public static String resizeByHeight(int height, String savePath, URL targetURL) throws ImageFormatException, IOException {
                  image = ImageIO.read(targetURL);
                  int[] size = getSizeByHeight(height, image);
                  return resize(size[0], size[1], savePath, image);
              }
              
              /**
               * <b>function:</b>
               * @author hoojo
               * @createDate 2012-2-3 上午10:08:47
               * @param args
               * @throws IOException 
               * @throws MalformedURLException 
               * @throws ImageFormatException 
               */
              public static void main(String[] args) throws ImageFormatException, MalformedURLException, IOException {
                  
                  System.out.println(ScaleImageUtils.resize(140, 140, null, new URL("http://www.open-open.com/lib/images/logo.jpg")));
                  ScaleImageUtils.resize(100, 100, ImageQuality.high.getQuality(), null, ImageIO.read(new URL("http://www.open-open.com/lib/images/logo.jpg")));
              }
          }
           


          作者:hoojo
          出處:
          blog:http://blog.csdn.net/IBM_hoojo
                   http://hoojo.cnblogs.com
          本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


          版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處 本文出自:
          分享道版權(quán)所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處,謝謝
          posted on 2012-02-08 13:48 hoojo 閱讀(2563) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JavaEE 、JavaSE
          主站蜘蛛池模板: 岱山县| 亚东县| 兴业县| 镇远县| 启东市| 吴忠市| 阳山县| 保亭| 镇赉县| 赤水市| 扶余县| 剑阁县| 桃园县| 上饶县| 泸溪县| 阜南县| 正宁县| 于田县| 汤原县| 抚松县| 怀远县| 和平区| 台中县| 东莞市| 泉州市| 清河县| 韩城市| 太和县| 嘉义市| 泰安市| 五常市| 凌云县| 察哈| 塔河县| 光山县| 富宁县| 晋中市| 广灵县| 大洼县| 清远市| 南宁市|