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;
}
}
图片按比例压缩
最新推荐文章于 2023-12-16 20:28:59 发布