直接上代码:
package com.yx.test.image;import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import javax.imageio.ImageIO;/*** ImageUtil** @author yx* @date 2019/12/10 9:22*/
public class ImageUtil {public static void main(String[] args) {reSize(new File("F:\\temp\\1\\qrcode_258_258.jpg"),new File("F:\\temp\\2\\320_320.jpg"),320, 320, true);reSize(new File("F:\\temp\\1\\qrcode_258_258.jpg"),new File("F:\\temp\\2\\320_340.jpg"),320, 340, false);}/*** @param srcImg 原图片* @param destImg 目标位置* @param width 期望宽* @param height 期望高* @param equalScale 是否等比例缩放*/public static void reSize(File srcImg, File destImg, int width,int height, boolean equalScale) {String type = getImageType(srcImg);if (type == null) {return;}if (width < 0 || height < 0) {return;}BufferedImage srcImage = null;try {srcImage = ImageIO.read(srcImg);System.out.println("srcImg size=" + srcImage.getWidth() + "X" + srcImage.getHeight());} catch (IOException e) {e.printStackTrace();return;}if (srcImage != null) {// targetW,targetH分别表示目标长和宽BufferedImage target = null;double sx = (double) width / srcImage.getWidth();double sy = (double) height / srcImage.getHeight();// 等比缩放if (equalScale) {if (sx > sy) {sx = sy;width = (int) (sx * srcImage.getWidth());} else {sy = sx;height = (int) (sy * srcImage.getHeight());}}System.out.println("destImg size=" + width + "X" + height);ColorModel cm = srcImage.getColorModel();WritableRaster raster = cm.createCompatibleWritableRaster(width, height);boolean alphaPremultiplied = cm.isAlphaPremultiplied();target = new BufferedImage(cm, raster, alphaPremultiplied, null);Graphics2D g = target.createGraphics();// smoother than exlax:g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g.drawRenderedImage(srcImage, AffineTransform.getScaleInstance(sx, sy));g.dispose();// 将转换后的图片保存try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(target, type, baos);FileOutputStream fos = new FileOutputStream(destImg);fos.write(baos.toByteArray());fos.flush();fos.close();} catch (IOException e) {e.printStackTrace();}}}/*** 获取文件后缀不带.** @param file 文件后缀名* @return*/private static String getImageType(File file) {if (file != null && file.exists() && file.isFile()) {String fileName = file.getName();int index = fileName.lastIndexOf(".");if (index != -1 && index < fileName.length() - 1) {return fileName.substring(index + 1);}}return null;}
}
运行效果:
srcImg size=258X258
destImg size=320X320
srcImg size=258X258
destImg size=320X340