All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lone.common.util.file.ScaleImageUtils Maven / Gradle / Ivy

The newest version!
package com.lone.common.util.file;

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;

/**
 * function: 缩放图片工具类,创建缩略图、伸缩图片比例
 * 
 * @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 = PropertiesHolder.getConfValue("uploadpath");

	/**
	 * function: 设置图片压缩质量枚举类; 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;

	/**
	 * function: 通过目标对象的大小和标准(指定)大小计算出图片缩小的比例
	 * 
	 * @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);
	}

	/**
	 * function: 将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;
	}

	/**
	 * function: 可以设置图片缩放质量,并且可以根据指定的宽高缩放图片
	 * 
	 * @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;
	}

	/**
	 * function: 通过指定大小和图片的大小,计算出图片缩小的合适大小
	 * 
	 * @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)) };
	}

	/**
	 * function: 通过指定的比例和图片对象,返回一个放大或缩小的宽度、高度
	 * 
	 * @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 };
	}

	/**
	 * 
	 * function:
	 * 将指定的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);
	}

	/**
	 * 
	 * function:
	 * 将指定的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);
	}

	/**
	 * function: 将一个本地的图片文件按照指定的比例进行缩放
	 * 
	 * @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);
	}

	/**
	 * function: 将一个网络图片文件按照指定的比例进行缩放
	 * 
	 * @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);
	}

	/**
	 * function: 按照固定宽度进行等比缩放本地图片
	 * 
	 * @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);
	}

	/**
	 * function: 按照固定宽度进行等比缩放网络图片
	 * 
	 * @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);
	}

	/**
	 * 
	 * function: 按照固定高度进行等比缩放本地图片
	 * 
	 * @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);
	}

	/**
	 * function: 按照固定高度进行等比缩放网络图片
	 * 
	 * @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);
	}

	/**
	 * function:
	 * 
	 * @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")));
//	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy