/*
 *    Copyright 2012-2013 The Haohui Network Corporation
 */
package com.haohui.common.utils;

import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.Image;  
import java.awt.Rectangle;
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStream;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

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;  
  
/**
 * 图片压缩工具类 提供的方法中可以设定生成的 缩略图片的大小尺寸、压缩尺寸的比例、图片的质量等
 * <pre>
 * 	调用示例:
 * resiz(srcImg, tarDir + "car_1_maxLength_11-220px-hui.jpg", 220, 0.7F);
 * </pre> 
 * 
 * @project haohui-b2b
 * @author cevencheng
 * @create 2012-3-22 下午8:29:01
 */
public class ImageUtil {  
  
    /** 
     * * 图片文件读取 
     *  
     * @param srcImgPath 
     * @return 
     */  
    private static BufferedImage InputImage(String srcImgPath) throws RuntimeException {  
  
        BufferedImage srcImage = null;
        FileInputStream in = null;
        try {  
            // 构造BufferedImage对象  
            File file = new File(srcImgPath);  
            in = new FileInputStream(file);  
            byte[] b = new byte[5];  
            in.read(b);  
            srcImage = javax.imageio.ImageIO.read(file);  
        } catch (IOException e) {  
        	e.printStackTrace();  
        	throw new RuntimeException("读取图片文件出错!", e);
        } finally {
        	if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					throw new RuntimeException("读取图片文件出错!", e);
				}
			}
        }
        return srcImage;  
    }  
  
    /** 
     * * 将图片按照指定的图片尺寸、源图片质量压缩(默认质量为1) 
     *  
     * @param srcImgPath 
     *            :源图片路径 
     * @param outImgPath 
     *            :输出的压缩图片的路径 
     * @param new_w 
     *            :压缩后的图片宽 
     * @param new_h 
     *            :压缩后的图片高 
     */  
    public static void resize(String srcImgPath, String outImgPath,  
            int new_w, int new_h) {  
        resize(srcImgPath, outImgPath, new_w, new_h, 1F);  
    }  
  
    /** 
     * 将图片按照指定的尺寸比例、源图片质量压缩(默认质量为1) 
     *  
     * @param srcImgPath 
     *            :源图片路径 
     * @param outImgPath 
     *            :输出的压缩图片的路径 
     * @param ratio 
     *            :压缩后的图片尺寸比例 
     * @param per 
     *            :百分比 
     */  
    public static void resize(String srcImgPath, String outImgPath,  
            float ratio) {  
        resize(srcImgPath, outImgPath, ratio, 1F);  
    }  
  
    /** 
     * 将图片按照指定长或者宽的最大值来压缩图片(默认质量为1) 
     *  
     * @param srcImgPath 
     *            :源图片路径 
     * @param outImgPath 
     *            :输出的压缩图片的路径 
     * @param maxLength 
     *            :长或者宽的最大值 
     * @param per 
     *            :图片质量 
     */  
    public static void resize(String srcImgPath, String outImgPath,  
            int maxLength) {  
        resize(srcImgPath, outImgPath, maxLength, 1F);  
    }  
  
    /** 
     * * 将图片按照指定的图片尺寸、图片质量压缩 
     *  
     * @param srcImgPath 
     *            :源图片路径 
     * @param outImgPath 
     *            :输出的压缩图片的路径 
     * @param new_w 
     *            :压缩后的图片宽 
     * @param new_h 
     *            :压缩后的图片高 
     * @param per 
     *            :百分比 
     * @author cevencheng
     */  
    public static void resize(String srcImgPath, String outImgPath,  
            int new_w, int new_h, float per) {  
        // 得到图片  
        BufferedImage src = InputImage(srcImgPath);  
        int old_w = src.getWidth();  
        // 得到源图宽  
        int old_h = src.getHeight();  
        // 得到源图长  
        // 根据原图的大小生成空白画布  
        BufferedImage tempImg = new BufferedImage(old_w, old_h,  
                BufferedImage.TYPE_INT_RGB);  
        // 在新的画布上生成原图的缩略图  
        Graphics2D g = tempImg.createGraphics();  
        g.setColor(Color.white);  
        g.fillRect(0, 0, old_w, old_h);  
        g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);  
        g.dispose();  
        BufferedImage newImg = new BufferedImage(new_w, new_h,  
                BufferedImage.TYPE_INT_RGB);  
        newImg.getGraphics().drawImage(  
                tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,  
                0, null);  
        // 调用方法输出图片文件  
        outImage(outImgPath, newImg, per);  
    }  
  
    /** 
     * * 将图片按照指定的尺寸比例、图片质量压缩 
     *  
     * @param srcImgPath 
     *            :源图片路径 
     * @param outImgPath 
     *            :输出的压缩图片的路径 
     * @param ratio 
     *            :压缩后的图片尺寸比例 
     * @param per 
     *            :百分比 
     * @author cevencheng
     */  
    public static void resize(String srcImgPath, String outImgPath,  
            float ratio, float per) {  
        // 得到图片  
        BufferedImage src = InputImage(srcImgPath);  
        int old_w = src.getWidth();  
        // 得到源图宽  
        int old_h = src.getHeight();  
        // 得到源图长  
        int new_w = 0;  
        // 新图的宽  
        int new_h = 0;  
        // 新图的长  
        BufferedImage tempImg = new BufferedImage(old_w, old_h,  
                BufferedImage.TYPE_INT_RGB);  
        Graphics2D g = tempImg.createGraphics();  
        g.setColor(Color.white);  
        // 从原图上取颜色绘制新图g.fillRect(0, 0, old_w, old_h);  
        g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);  
        g.dispose();  
        // 根据图片尺寸压缩比得到新图的尺寸new_w = (int) Math.round(old_w * ratio);  
        new_h = (int) Math.round(old_h * ratio);  
        BufferedImage newImg = new BufferedImage(new_w, new_h,  
                BufferedImage.TYPE_INT_RGB);  
        newImg.getGraphics().drawImage(  
                tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,  
                0, null);  
        // 调用方法输出图片文件OutImage(outImgPath, newImg, per);  
    }  
  
    /** 
     * <b>
     * 指定长或者宽的最大值来压缩图片
     * 	推荐使用此方法 
     * </b>
     * @param srcImgPath 
     *            :源图片路径 
     * @param outImgPath 
     *            :输出的压缩图片的路径 
     * @param maxLength 
     *            :长或者宽的最大值 
     * @param per 
     *            :图片质量 
     * @author cevencheng
     */  
    public static void resize(String srcImgPath, String outImgPath,  
            int maxLength, float per) {  
        // 得到图片  
        BufferedImage src = InputImage(srcImgPath);  
        int old_w = src.getWidth();  
        // 得到源图宽  
        int old_h = src.getHeight();  
        // 得到源图长  
        int new_w = 0;  
        // 新图的宽  
        int new_h = 0;  
        // 新图的长  
        BufferedImage tempImg = new BufferedImage(old_w, old_h,  
                BufferedImage.TYPE_INT_RGB);  
        Graphics2D g = tempImg.createGraphics();  
        g.setColor(Color.white);  
        // 从原图上取颜色绘制新图  
        g.fillRect(0, 0, old_w, old_h);  
        g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);  
        g.dispose();  
        // 根据图片尺寸压缩比得到新图的尺寸  
        if (old_w > old_h) {  
            // 图片要缩放的比例  
            new_w = maxLength;  
            new_h = (int) Math.round(old_h * ((float) maxLength / old_w));  
        } else {  
            new_w = (int) Math.round(old_w * ((float) maxLength / old_h));  
            new_h = maxLength;  
        }  
        BufferedImage newImg = new BufferedImage(new_w, new_h,  
                BufferedImage.TYPE_INT_RGB);  
        newImg.getGraphics().drawImage(  
                tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,  
                0, null);  
        // 调用方法输出图片文件  
        outImage(outImgPath, newImg, per);  
    }  
    
    /**
     * <pre>
     * <b>将图片压缩成指定宽度, 高度等比例缩放</b>
     * 推荐质量设置为 :0.956f ~ 0.96 通常都与主流网站压缩出来的大小一样
     * </pre>
     * 
     * @param srcImgPath
     * @param outImgPath
     * @param width
     * @param per
     */
    public static void resizeFixedWidth(String srcImgPath, String outImgPath,  
    		int width, float per) {  
    	// 得到图片  
    	BufferedImage src = InputImage(srcImgPath);  
    	int old_w = src.getWidth();  
    	// 得到源图宽  
    	int old_h = src.getHeight();  
    	// 得到源图长  
    	int new_w = 0;  
    	// 新图的宽  
    	int new_h = 0;  
    	// 新图的长  
    	BufferedImage tempImg = new BufferedImage(old_w, old_h,  
    			BufferedImage.TYPE_INT_RGB);  
    	Graphics2D g = tempImg.createGraphics();  
    	g.setColor(Color.white);  
    	// 从原图上取颜色绘制新图  
    	g.fillRect(0, 0, old_w, old_h);  
    	g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);  
    	g.dispose();  
    	// 根据图片尺寸压缩比得到新图的尺寸  
    	if (old_w > old_h) { //矮宽矮宽型  
    		// 图片要缩放的比例  
    		new_w = width;  
    		new_h = (int) Math.round(old_h * ((float) width / old_w));  
    	} else { //竖长竖长
    		// new_w = width; 
    		float rate = ((float) width / old_w);
    		new_w = (int) Math.floor(old_w * rate);  
    		new_h = (int) Math.floor(old_h * rate);
    		
    		System.out.println("new_w=" + new_w + ", new_h=" + new_h);
    	}  
    	BufferedImage newImg = new BufferedImage(new_w, new_h,  
    			BufferedImage.TYPE_INT_RGB);  
    	newImg.getGraphics().drawImage(  
    			tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,  
    			0, null);  
    	// 调用方法输出图片文件  
    	outImage(outImgPath, newImg, per);  
    } 
    
    /**
     * 将图片缩放到指定的宽度
     * 
     * @param srcImgPath
     * @param outImgPath
     * @param width
     * @param per
     * @return
     */
    public static Image resizeFixedWidth(Image srcImg, File inputFile, String outImgPath,  
    		int width, float per) {  
    	// 得到图片  
    	Image src = srcImg;  
    	int old_w = src.getWidth(null);  
    	// 得到源图宽  
    	int old_h = src.getHeight(null);
    	if (width >= old_w) { //不需要缩放
        	// 调用方法输出图片文件  
        	FileUtil.copyFile(inputFile, new File(outImgPath));
        	return srcImg;
		}
    	// 得到源图长  
    	int new_w = 0;  
    	// 新图的宽  
    	int new_h = 0;  
    	// 新图的长  
    	BufferedImage tempImg = new BufferedImage(old_w, old_h,  
    			BufferedImage.TYPE_INT_RGB);  
    	Graphics2D g = tempImg.createGraphics();  
    	g.setColor(Color.white);  
    	// 从原图上取颜色绘制新图  
    	g.fillRect(0, 0, old_w, old_h);  
    	g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);  
    	g.dispose();  
    	// 根据图片尺寸压缩比得到新图的尺寸  
    	if (old_w > old_h) { //矮宽矮宽型  
    		// 图片要缩放的比例  
    		new_w = width;  
    		new_h = (int) Math.round(old_h * ((float) width / old_w));  
    	} else { //竖长竖长
    		// new_w = width; 
    		float rate = ((float) width / old_w);
    		new_w = (int) Math.floor(old_w * rate);  
    		new_h = (int) Math.floor(old_h * rate);
    	}  
    	BufferedImage newImg = new BufferedImage(new_w, new_h,  
    			BufferedImage.TYPE_INT_RGB);  
    	newImg.getGraphics().drawImage(  
    			tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,  
    			0, null);  
    	// 调用方法输出图片文件  
    	outImage(outImgPath, newImg, per);
    	return newImg;
    } 
  
    /** 
     * * 将图片文件输出到指定的路径,并可设定压缩质量 
     *  
     * @param outImgPath 
     * @param newImg 
     * @param per 
     * @author cevencheng
     */  
    private static void outImage(String outImgPath, BufferedImage newImg, float per) {  
        // 判断输出的文件夹路径是否存在,不存在则创建  
        File file = new File(outImgPath);  
        if (!file.getParentFile().exists()) {  
            file.getParentFile().mkdirs();  
        }
        // 输出到文件流
        FileOutputStream fos = null;
        try {  
            fos = new FileOutputStream(outImgPath);  
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);  
            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(newImg);  
            // 压缩质量  
            jep.setQuality(per, true);  
            encoder.encode(newImg, jep);  
            fos.close();  
        } catch (Exception e) { 
        	throw new RuntimeException(e);
        } finally {
        	if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			}
        }
    }  
    
	private static void outImage(String outImgPath, Image outputImage, String format) {
		int outputWidth = outputImage.getWidth(null);
		if (outputWidth < 1)
			throw new IllegalArgumentException("output image width " + outputWidth + " is out of range");
		int outputHeight = outputImage.getHeight(null);
		if (outputHeight < 1)
			throw new IllegalArgumentException("output image height " + outputHeight + " is out of range");
		// 判断输出的文件夹路径是否存在,不存在则创建
		File file = new File(outImgPath);
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}
		// 输出到文件流
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file);
			// Get a buffered image from the image.
			BufferedImage bi = new BufferedImage(outputWidth, outputHeight, BufferedImage.TYPE_INT_RGB);
			Graphics2D biContext = bi.createGraphics();
			biContext.drawImage(outputImage, 0, 0, null);
			ImageIO.write(bi, format, fos);
			fos.flush();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			try {
				fos.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}

	}
  
    /**
     * 图片剪切工具方法
     * 
     * @param srcfile 源图片
     * @param outfile 剪切之后的图片
     * @param x 剪切顶点 X 坐标
     * @param y 剪切顶点 Y 坐标
     * @param width 剪切区域宽度
     * @param height 剪切区域高度
     * 
     * @throws IOException
     * @author cevencheng
     */
	public static void cut(File srcfile, File outfile, int x, int y, int width, int height) throws IOException {
		FileInputStream is = null;
		ImageInputStream iis = null;
		try {
			// 读取图片文件
			is = new FileInputStream(srcfile);

			/*
			 * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。
			 * 参数:formatName - 包含非正式格式名称 .(例如 "jpeg" 或 "tiff")等 。
			 */
			Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");
			ImageReader reader = it.next();
			// 获取图片流
			iis = ImageIO.createImageInputStream(is);

			/*
			 * <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
			 * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
			 */
			reader.setInput(iis, true);

			/*
			 * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
			 * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其 ImageReader 实现的
			 * getDefaultReadParam 方法中返回 ImageReadParam 的实例。
			 */
			ImageReadParam param = reader.getDefaultReadParam();

			/*
			 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
			 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
			 */
			Rectangle rect = new Rectangle(x, y, width, height);

			// 提供一个 BufferedImage,将其用作解码像素数据的目标。
			param.setSourceRegion(rect);

			/*
			 * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的
			 * BufferedImage 返回。
			 */
			BufferedImage bi = reader.read(0, param);

			// 保存新图片
			ImageIO.write(bi, "jpg", outfile);
		} finally {
			if (is != null) {
				is.close();
			}
			if (iis != null) {
				iis.close();
			}
		}
    }
	
	/**
	 * 将图片裁剪成最大尺寸的正方形, 以便日后进行正方形缩放
	 * 
	 * @param srcfile
	 * @param outfile
	 * @throws IOException
	 */
	public static void cut2Square(File srcfile, File outfile) throws IOException {
		FileInputStream is = null;
		ImageInputStream iis = null;
		// 裁剪的 顶点坐标,宽和高
		int x = 0,y = 0,width = 0,height = 0;
		try {
			// 得到图片  
	    	BufferedImage src = InputImage(srcfile.getPath());
	    	// 得到源图宽
	    	int old_w = src.getWidth();  
	    	// 得到源图高  
	    	int old_h = src.getHeight();
	    	int max = old_w;
	    	// 正方形的最大值,只能为长和宽中的最小值
	    	if (old_h > old_w) { //竖长竖长
				// 计算高度要裁剪多少
				int cut_h = (old_h - old_w);
				x = 0;
				y =  (int) Math.round((float) cut_h / 2);
			} else { //矮宽矮宽
				max = old_h;
				int cut_w = (old_w - old_h);
				y = 0;
				x = (int) Math.round((float) cut_w / 2);
			}
	    	
	    	width = max;
	    	height = max;
			
			// 读取图片文件
			is = new FileInputStream(srcfile);

			/*
			 * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。
			 * 参数:formatName - 包含非正式格式名称 .(例如 "jpeg" 或 "tiff")等 。
			 */
			Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");
			ImageReader reader = it.next();
			// 获取图片流
			iis = ImageIO.createImageInputStream(is);

			/*
			 * <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
			 * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
			 */
			reader.setInput(iis, true);

			/*
			 * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
			 * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其 ImageReader 实现的
			 * getDefaultReadParam 方法中返回 ImageReadParam 的实例。
			 */
			ImageReadParam param = reader.getDefaultReadParam();

			/*
			 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
			 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
			 */
			Rectangle rect = new Rectangle(x, y, width, height);

			// 提供一个 BufferedImage,将其用作解码像素数据的目标。
			param.setSourceRegion(rect);

			/*
			 * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的
			 * BufferedImage 返回。
			 */
			BufferedImage bi = reader.read(0, param);

			// 保存新图片
			ImageIO.write(bi, "jpg", outfile);
		} finally {
			if (is != null) {
				is.close();
			}
			if (iis != null) {
				iis.close();
			}
		}
    }
    
    public static void main(String args[]) throws Exception {  
//        String srcImg = "c:/img/car_2.jpg";  
//        String tarDir = "c:/img/newImg/";  
//        URL url = ImageUtil.class.getResource("src-2012.jpg");
//        File srcfile = new File(url.toURI());
//        System.out.println(url);
//        System.out.println(srcfile.exists() + ", dir=" + srcfile.getParent());
//        tarDir = srcfile.getParent();
//        srcImg = srcfile.getPath();
//        System.out.println("srcImg=" + srcImg);
//        long startTime = new Date().getTime();  
//        resize(srcImg, tarDir + "car_1_maxLength_1-200px.jpg", 200);  
////        Tosmallerpic(srcImg, tarDir + "car_1_maxLength_2.jpg", 0.5F);  
//        resize(srcImg, tarDir + "car_1_maxLength_3.jpg", 400, 500);  
//        resize(srcImg, tarDir + "car_1_maxLength_4-400x400.jpg", 220, 220);  
//        resize(srcImg, tarDir + "car_1_maxLength_11-220px-yinhui.jpg", 220, 0.7F);  
////        Tosmallerpic(srcImg, tarDir + "car_1_maxLength_22.jpg", 0.5F, 0.8F);  
//        resize(srcImg, tarDir + "car_1_maxLength_33.jpg", 400, 500, 0.8F);  
//        System.out.println(new Date().getTime() - startTime);  
        
//        String photoDir = "/Volumes/SkyDrive/www/photos";
//		String filename = "pic_802x1203.jpg";
//		File srcfile = new File(photoDir, filename);
//		
//		File outfile = new File(photoDir, filename + "_802x802.jpg");
//		cut2Square(srcfile, outfile);
//		
    	
    	// 在原始最大号的正方形的基础上再缩放成小图
//		String photoDir = "/Volumes/SkyDrive/www/photos";
//		String filename = "pic_802x1203.jpg_802x802.jpg";
//		File srcfile = new File(photoDir, filename);
//		
//		File outfile = new File(photoDir, filename + "_aa_100x100.jpg");
//		resize(srcfile.getPath(), outfile.getPath(), 100, 0.96f);
		
		// 对竖长竖长的大图缩放成 固定 宽度的图片
//    	long start = System.currentTimeMillis();
//		String photoDir = "/Volumes/SkyDrive/www/photos";
//		String filename = "pic_802x1203.jpg";
//		File srcfile = new File(photoDir, filename);
////		
//		File outfile = new File(photoDir, filename + "_bb_225x999.jpg");
//		resizeFixedWidth(srcfile.getPath(), outfile.getPath(), 225, 0.956f);
//		System.out.println("对竖长竖长的大图缩放成 固定 宽度的图片... 缩放完毕");
//		long end = System.currentTimeMillis();
//		System.out.println("[耗时:] " + (end - start) + " ms");
    	
//    	long start = System.currentTimeMillis();
//		String photoDir = "/Volumes/SkyDrive/www/photos";
//		String filename = "pic_2.jpg";
//		File srcfile = new File(photoDir, filename);
////		
//		File outfile = new File(photoDir, filename + "_cc_225x999.jpg");
////		resizeFixedWidth(srcfile.getPath(), outfile.getPath(), 225, 0.956f);
//		resizeFixedWidth(srcfile.getPath(), outfile.getPath(), 225, 0.9f);
//		System.out.println("对竖长竖长的大图缩放成 固定 宽度的图片... 缩放完毕");
//		long end = System.currentTimeMillis();
//		System.out.println("[耗时:] " + (end - start) + " ms");
    	
    	long start = System.currentTimeMillis();
		String photoDir = "/Volumes/SkyDrive/www/photos/mogujie";
		String filename = "T1H6kLXgtdXXXXXXXX_!!0-item_pic.jpg";
		File srcfile = new File(photoDir, filename);
//		
		Image image = ImageSizer.loadImage(srcfile);
		File outfile = new File(photoDir, filename + "_oo99xx_225x999.jpg");
		resizeFixedWidth(srcfile.getPath(), outfile.getPath(), 225, 0.956f);
		Image resizeImage = resizeFixedWidth(image, srcfile, outfile.getPath(), 225, 0.9f);
//		Image resizeImage = ImageSizer.resize(image, outfile, 225, "jpg");
		System.out.println("对竖长竖长的大图缩放成 固定 宽度的图片... 缩放完毕" + resizeImage.getWidth(null) + "x" + resizeImage.getHeight(null));
		long end = System.currentTimeMillis();
		System.out.println("[耗时:] " + (end - start) + " ms");
    }  
}  
最近下载更多
yt94103629  LV2 2020年11月30日
韩毅飞  LV11 2020年11月7日
is_gary  LV15 2019年11月10日
chenyiiqng  LV5 2019年7月11日
飞奔45  LV5 2019年7月8日
tewu_spy  LV1 2019年7月1日
mengnan8989  LV22 2019年4月28日
小诺快速开发平台  LV10 2019年3月14日
飞翔的企鹅嗯嗯  LV11 2019年1月29日
snlx258  LV1 2019年1月18日
最近浏览更多
ls2008  LV15 2022年6月22日
小资李  LV13 2022年6月15日
wanglinddad  LV54 2022年4月28日
JiaoTianLe  LV1 2021年11月22日
cindyd  LV1 2021年11月1日
少年和她 2021年9月23日
暂无贡献等级
fengjinmin  LV3 2021年5月9日
13427720820  LV8 2021年4月1日
yt94103629  LV2 2020年11月30日
韩毅飞  LV11 2020年11月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友