图片按比例压缩

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

@SuppressWarnings("restriction")
public class ImageCompress {
	/**
	 * 
	 * @param newImageSavePath
	 *            新生成图片的保存的路径地址
	 * @param sourceImageFile
	 *            源图的File对象
	 * @param newImageExtName
	 *            新图添加的名字,以区别源图
	 * @param sourceImageFileName
	 *            源图的文件名字
	 * @param newImageWidth
	 *            新图的宽度
	 * @param newImageHeight
	 *            新图的高度
	 * @param newImageQualityPercent
	 *            新图的压缩质量
	 * @param newImageBackcolor
	 *            新图的背景颜色
	 */
	public static void compress(String newImageSavePath, File sourceImageFile,
			String newImageExtName, String sourceImageFileName,
			int newImageWidth, int newImageHeight,
			float newImageQualityPercent, Color newImageBackcolor,
			boolean isReviseSourceImage) {
		// 定义一个Image对象
		Image sourceImage = null;

		try {
			// 构造Image对象
			sourceImage = ImageIO.read(sourceImageFile);
			// 为将要压缩出来的Image构建新的名称
			String imageCompressFilePath = newImageSavePath
					+ sourceImageFileName.substring(0,
							sourceImageFileName.indexOf("."))
					+ newImageExtName
					+ sourceImageFileName.substring(sourceImageFileName
							.indexOf("."));
			// 得到源图的宽度
			int sourceImageWidth = sourceImage.getWidth(null);
			// 得到源图的高度
			int sourceImageHeight = sourceImage.getHeight(null);
			// 定义新的图片的宽度以及高度
			int newWidth = 0;
			int newHeight = 0;
			// 计算源图与所需要生成的新图的长宽比例
			double widthPercent = (sourceImageWidth * 1.00)
					/ (newImageWidth * 1.00);
			double heightPercent = (sourceImageHeight * 1.00)
					/ (newImageHeight * 1.00);
			
			//判断是否需要对源图进行调整
			if(isReviseSourceImage == true) {
				sourceImage = revise(sourceImage, newImageBackcolor);
			}
			
			// 计算新图长
			if (sourceImageWidth > newImageWidth) {
				newWidth = (int) Math.round(sourceImageWidth / widthPercent);
			} else {
				newWidth = sourceImageWidth;
			}
			// 计算新图宽
			if (sourceImageHeight > newImageHeight) {
				newHeight = (int) Math.round(sourceImageHeight / heightPercent);
			} else {
				newHeight = sourceImageHeight;
			}

			BufferedImage newImageBufferedImage = new BufferedImage(newWidth, newHeight,
					BufferedImage.TYPE_INT_RGB);
			// 绘制缩小后的图
			newImageBufferedImage.getGraphics().drawImage(
					sourceImage.getScaledInstance(newWidth, newHeight,
							Image.SCALE_SMOOTH), 0, 0, null);
			// 输出到文件流
			FileOutputStream newImageFileOutputStream = new FileOutputStream(
					imageCompressFilePath);
			JPEGImageEncoder encoder = JPEGCodec
					.createJPEGEncoder(newImageFileOutputStream);
			JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(newImageBufferedImage);
			// 压缩质量
			jep.setQuality(newImageQualityPercent, true);
			encoder.encode(newImageBufferedImage, jep);
			newImageFileOutputStream.close();
		} catch (IOException ex) {
			Logger.getLogger(ImageCompress.class.getName()).log(Level.SEVERE,
					null, ex);
		}
	}

	public static Image revise(Image sourceImage, Color newImageBackcolor) {
		// 得到源图的宽度
		int sourceImageWidth = sourceImage.getWidth(null);
		// 得到源图的高度
		int sourceImageHeight = sourceImage.getHeight(null);
		// 图片根据长宽留白,成一个正方形图。
		BufferedImage sourceImageBufferedImage = null;
		if (sourceImageWidth > sourceImageHeight) {
			sourceImageBufferedImage = new BufferedImage(sourceImageWidth, sourceImageWidth,
					BufferedImage.TYPE_INT_RGB);
		} else {
			if (sourceImageWidth < sourceImageHeight) {
				sourceImageBufferedImage = new BufferedImage(sourceImageHeight,
						sourceImageHeight, BufferedImage.TYPE_INT_RGB);
			} else {
				sourceImageBufferedImage = new BufferedImage(sourceImageWidth, sourceImageHeight,
						BufferedImage.TYPE_INT_RGB);
			}
		}
		Graphics2D graphics2D = sourceImageBufferedImage.createGraphics();
		graphics2D.setColor(newImageBackcolor);
		if (sourceImageWidth > sourceImageHeight) {
			graphics2D.fillRect(0, 0, sourceImageWidth, sourceImageWidth);
			graphics2D.drawImage(sourceImage, 0,
					(sourceImageWidth - sourceImageHeight) / 2,
					sourceImageWidth, sourceImageHeight, newImageBackcolor, null);
		} else {
			if (sourceImageWidth < sourceImageHeight) {
				graphics2D.fillRect(0, 0, sourceImageHeight, sourceImageHeight);
				graphics2D.drawImage(sourceImage,
						(sourceImageHeight - sourceImageWidth) / 2, 0,
						sourceImageWidth, sourceImageHeight, newImageBackcolor,
						null);
			} else {
				graphics2D.drawImage(sourceImage
						.getScaledInstance(sourceImageWidth, sourceImageHeight,
								Image.SCALE_SMOOTH), 0, 0, null);
			}
		}
		graphics2D.dispose();
		return sourceImageBufferedImage;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值