用户上传的图片大小不一,导致显示时杂乱无章,因此需要对用户上传的照片进行简单的处理,处理成统一大小,处理思路:为了防止变形,需要保持图片长宽比不变,原图片的长宽比可能与目标长宽比不一致,因此需要先保持长宽比不变进行缩放处理,使长或宽与目标一致,然后将多出的部分截取掉。具体实现看代码:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.RenderedImage;
import java.io.File;
import javax.imageio.ImageIO;
/**
* ImageUtils
*
* @version 1.0 2011-7-27
* @author zhanzhengqiang
*/
public class ImageUtils {
/**
* @param args
*/
public static void main(String[] args) {
resize(new File("d:\\test.jpg"), new File("d:\\test2.jpg"), 200, 400);
}
/**
* 缩放图片
* @param srcPic 原始图片文件
* @param destPic 目标图片文件
* @param width 目标宽度
* @param height 目标高度
*/
public static void resize(File srcPic, File destPic, int width, int height) {
try {
// 加载原始图片
BufferedImage srcBufferedImg = ImageIO.read(srcPic);
// 获得原始图片的宽度
int srcImageWidth = srcBufferedImg.getWidth();
// 获得原始图片的高度
int srcImageHeight = srcBufferedImg.getHeight();
// 输出调试信息
debug("原始图片尺寸:" + srcImageWidth + " X " + srcImageHeight);
// 计算缩放后的高度和宽度
int scaledHeight = width * srcImageHeight / srcImageWidth;
int scaledWidth = height * srcImageWidth / srcImageHeight;
// 根据计算得出的缩放高度和宽度,计算保证不丢失像素的情况下,
// 同比例缩放后的图片高度和宽度及需要切割的起始坐标
int realScaledWidth = width, realScaledHeight = height; // 实际缩放后宽度和高度
int x = 0, y = 0; // 切割起始坐标
double scale = 0; // 实际统一缩小比例
if (scaledHeight > height) { // 根据宽度缩放,可以保证高度方向不丢失像素
realScaledHeight = scaledHeight;
scale = (double) width / srcImageWidth;
y = (scaledHeight - height) / 2;
} else if (scaledHeight < height) { // 根据高度缩放,可以保证宽度方向不丢失像素
realScaledWidth = scaledWidth;
scale = (double) height / srcImageHeight;
x = (scaledWidth - width) / 2;
}
// 调试信息
debug("统一缩放比例:" + scale);
debug("实际缩放后的图片尺寸:" + realScaledWidth + " X " + realScaledHeight);
debug("切割起始坐标:(" + x + "," + y + ")");
// 按统一比例缩小图片
Image scaledImage = srcBufferedImg.getScaledInstance(realScaledWidth, realScaledHeight,
Image.SCALE_SMOOTH);
// 定义输出BufferedImage
BufferedImage scaledBufferedImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Graphics scaledGrapics = scaledBufferedImg.getGraphics();
// 切割起始坐标不是原点,则切割图片
if (!(x == 0 && y == 0)) {
ImageFilter cropFilter = new CropImageFilter(x, y, width, height);
Image cutImage = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(scaledImage.getSource(), cropFilter));
scaledGrapics.drawImage(cutImage, 0, 0, null);
} else {
scaledGrapics.drawImage(scaledImage, 0, 0, null);
}
scaledGrapics.dispose();
// 获取图片格式
String format = getPictureFormat(destPic);
// 保存缩放后的图片
ImageIO.write((RenderedImage)scaledBufferedImg, format, destPic);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据图片文件获取图片格式
* @param picFile
* @return 图片格式
* @throws Exception
*/
private static String getPictureFormat(File picFile) throws Exception {
String picName = picFile.getName();
String format = "jpg"; // 默认图片格式
if (picName.indexOf('.') > 0) {
String pictureExt = picName.substring(picName.lastIndexOf('.') + 1).toLowerCase();
String[] fileSuffixes = ImageIO.getWriterFileSuffixes();
for (int i = 0; i < fileSuffixes.length; i++) {
if (pictureExt.equals(fileSuffixes[i])) {
format = fileSuffixes[i];
break;
}
}
}
// 输出调试信息
debug("图片名称:" + picName + ",对应图片格式为:" + format);
return format;
}
/**
* 输出调试信息
* @param msg
*/
private static void debug(String msg) {
if (true) {
System.out.println("DEBUG - " + msg);
}
}
}