java 圖片壓縮工具類

package test;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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> 縮放圖片工具類,創建縮略圖、伸縮圖片比例
 * @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 [email protected]
 * @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:/Users/Administrator/Desktop/www/777";
     
    /**
     * <b>function:</b> 設置圖片壓縮質量枚舉類;
     * 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 [email protected]
     * @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> 通過目標對象的大小和標準(指定)大小計算出圖片縮小的比例
     * @author hoojo
     * @createDate 2012-2-6 下午04:41:48
     * @param targetWidth 目標的寬度
     * @param targetHeight 目標的高度
     * @param standardWidth 標準(指定)寬度
     * @param standardHeight 標準(指定)高度
     * @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 即將縮放的目標圖片
     * @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;
    }
     
    /**
     * 縮放圖片 返回字節數組 並刪除壓縮圖
     */
    public static byte[] resizeToByte(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;
        }
        File file=new File(savePath);
        FileOutputStream fos = new FileOutputStream(file);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
        encoder.encode(image);
        image.flush();
        fos.flush();
        fos.close();
    	ByteArrayOutputStream output = new ByteArrayOutputStream();
        FileInputStream input=new FileInputStream(file);
        byte[] bytes=new byte[1024];
		int leng=0;
		while((leng=input.read(bytes)) != -1){
			output.write(bytes, 0, leng);
		}
		byte[] outByte=output.toByteArray();
		input.close();
		output.close();
		if(file.exists()){
			file.delete();
		}
        return outByte;
    }
    
    
    public static byte[] resizeTobyte(String fileOut){
    	try {
			File file=new File(fileOut);
			ByteArrayOutputStream output = new ByteArrayOutputStream();
			FileInputStream input=new FileInputStream(file);
			byte[] bytes=new byte[1024];
			int leng=0;
			while((leng=input.read(bytes)) != -1){
				output.write(bytes, 0, leng);
			}
			byte[] outByte=output.toByteArray();
			input.close();
			output.close();
			if(file.exists()){
				file.delete();
			}
			return outByte;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	return null;
    }
    
    /**
     * <b>function:</b> 可以設置圖片縮放質量,並且可以根據指定的寬高縮放圖片
     * @author hoojo
     * @createDate 2012-2-7 上午11:01:27
     * @param width 縮放的寬度
     * @param height 縮放的高度
     * @param quality 圖片壓縮質量,最大值是1; 使用枚舉值:{@link ImageQuality}
     *             Some guidelines: 0.75 high quality、0.5  medium quality、0.25 low quality
     * @param savePath 保存目錄
     * @param targetImage 即將縮放的目標圖片
     * @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;
        }
        /** 設置圖片壓縮質量 */  
        encodeParam.setQuality(quality, true);  
        encoder.encode(image, encodeParam);  
  
        image.flush();
        fos.flush();
        fos.close();
         
        return savePath;
    }
     
    /**
     * <b>function:</b> 通過指定大小和圖片的大小,計算出圖片縮小的合適大小
     * @author hoojo
     * @createDate 2012-2-6 下午05:53:10
     * @param width 指定的寬度
     * @param height 指定的高度
     * @param image 圖片文件
     * @return 返回寬度、高度的int數組
     */
    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> 通過指定的比例和圖片對象,返回一個放大或縮小的寬度、高度
     * @author hoojo
     * @createDate 2012-2-7 上午10:27:59
     * @param scale 縮放比例
     * @param image 圖片對象
     * @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 改變的目標圖片
     * @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網絡圖片文件的寬度、高度大於指定width、height的圖片縮小,並保存在savePath目錄
     * @author hoojo
     * @createDate 2012-2-6 下午04:57:07
     * @param width 縮小的寬度
     * @param height 縮小的高度
     * @param savePath 保存目錄
     * @param targetImage 改變的目標圖片
     * @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> 將指定的targetURL網絡圖片文件的寬度、高度大於指定width、height的圖片縮小,並保存在savePath目錄
     * @author hoojo
     * @createDate 2012-2-6 下午04:57:07
     * @param width 縮小的寬度
     * @param height 縮小的高度
     * @param savePath 保存目錄
     * @param targetImage 改變的目標圖片
     * @return 圖片保存路徑、名稱
     * @throws ImageFormatException
     * @throws IOException
     */
    public static String resizeFile(int width, int height, String savePath, File targetImage) throws ImageFormatException, IOException {
        image = ImageIO.read(targetImage);
        int[] size = getSize(width, height, image);
        return resize(size[0], size[1], savePath, image);
    }
    
    public static byte[] resizeFileToByte(int width, int height, String savePath, InputStream targetImage) throws ImageFormatException, IOException {
        image = ImageIO.read(targetImage);
        int[] size = getSize(width, height, image);
        return resizeToByte(size[0], size[1], savePath, image);
    }
    
    public static String resizeFileToPath(int width, int height, String savePath, InputStream targetImage) throws ImageFormatException, IOException {
        image = ImageIO.read(targetImage);
        int[] size = getSize(width, height, image);
        return resize(size[0], size[1], savePath, image);
    }
    
   
    /**
     * <b>function:</b> 將一個本地的圖片文件按照指定的比例進行縮放
     * @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> 將一個網絡圖片文件按照指定的比例進行縮放
     * @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> 按照固定寬度進行等比縮放本地圖片
     * @author hoojo
     * @createDate 2012-2-7 上午10:49:56
     * @param width 固定寬度
     * @param savePath 保存路徑、名稱
     * @param targetFile 本地目標文件
     * @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> 按照固定寬度進行等比縮放網絡圖片
     * @author hoojo
     * @createDate 2012-2-7 上午10:50:52
     * @param width 固定寬度
     * @param savePath 保存路徑、名稱
     * @param targetFile 本地目標文件
     * @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> 按照固定高度進行等比縮放本地圖片
     * @author hoojo
     * @createDate 2012-2-7 上午10:51:17
     * @param height 固定高度
     * @param savePath 保存路徑、名稱
     * @param targetFile 本地目標文件
     * @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> 按照固定高度進行等比縮放網絡圖片
     * @author hoojo
     * @createDate 2012-2-7 上午10:52:23
     * @param height 固定高度
     * @param savePath 保存路徑、名稱
     * @param targetFile 本地目標文件
     * @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 {
         File file=new File("C:/Users/Administrator/Desktop/www/aaa.jpg");
         FileInputStream input=new FileInputStream(file);
         String filePath=resizeFileToPath(1000, 1500, null, input);
         byte[] byres= resizeTobyte(filePath);
         System.out.println(byres);
         System.out.println(filePath);
    	
//    	File file=new File("C:/Users/Administrator/Desktop/www/7771453880623178.jpg");
//    	file.delete();
    }
}

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