package file; 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.File; import java.io.IOException; import javax.imageio.ImageIO; import net.coobird.thumbnailator.Thumbnails; public class ImageUtil { /** * 左上方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayLeftTop(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 0, 0); } /** * 右上方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayRightTop(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 1, 0); } /** * 左下方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayLeftButtom(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 0, 1); } /** * 右下方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayRightButtom(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 1, 1); } /** * 合成图片 x:前置图片所在x轴位置 y:前置图片所在y轴位置 */ public static String overlay(String bgImagePath, String fgImagePath, String overlayImagePath, int x, int y) { if (!strIsValid(bgImagePath) || !strIsValid(fgImagePath) || !strIsValid(overlayImagePath)) { throw new IllegalArgumentException(); } BufferedImage bgImage = readImage(bgImagePath); BufferedImage fgImage = readImage(fgImagePath); // 合成图片 BufferedImage overlayedImage = overlayImages(bgImage, fgImage, x, y); /** 输出图片 */ if (overlayedImage != null) { File file = new File(overlayImagePath); if (file.exists()) file.delete(); writeImage(overlayedImage, overlayImagePath, "PNG"); } return overlayImagePath; } /** * 合成图片 * * @param bgImage * @param fgImage * @return */ public static BufferedImage overlayImages(BufferedImage bgImage, BufferedImage fgImage, int x, int y) { if (fgImage.getHeight() > bgImage.getHeight() || fgImage.getWidth() > fgImage.getWidth()) { return null; } Graphics2D g = bgImage.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawImage(bgImage, 0, 0, null); g.drawImage(fgImage, x, y, null); g.dispose(); return bgImage; } /** * 读取图片 * * @param fileLocation * @return */ public static BufferedImage readImage(String fileLocation) { BufferedImage img = null; try { img = ImageIO.read(new File(fileLocation)); } catch (IOException e) { e.printStackTrace(); } return img; } /** * 输出图片 * * @param img * @param fileLocation * @param extension */ public static void writeImage(BufferedImage img, String fileLocation, String extension) { try { BufferedImage bi = img; File outputfile = new File(fileLocation); ImageIO.write(bi, extension, outputfile); } catch (IOException e) { e.printStackTrace(); } } /** * 检查图片的高度和宽度 * * @param imagePath * @param height * @param width * @return */ public static boolean checkImageHW(String imagePath, int height, int width) { if (StrUtil.isNullOrEmpty(imagePath)) return false; try { BufferedImage image = ImageIO.read(new File(imagePath)); int w = image.getWidth(); int h = image.getHeight(); return w == width && h == height; } catch (IOException e) { return false; } } /** * 图片等比例缩小 * * @param fromFileStr * : 原图片路径 * @param saveToFileStr * : 缩小后图片的路径 * @param width * : 图片缩小后的高度 * @param height * : 图片缩小后的宽度 * @throws Exception */ public static void shrinkImage(String fromFileStr, String saveToFileStr, int width, int height) { if (!strIsValid(fromFileStr) || !strIsValid(fromFileStr)) { throw new IllegalArgumentException("image path is null"); } try { Thumbnails.of(fromFileStr).size(width,height).toFile(saveToFileStr); } catch (IOException e) { throw new RuntimeException(e); } } /** * 图片缩小 * @param source * @param targetW * @param targetH * @param equalProportion 是否等比缩小 * @return */ public static BufferedImage resize(BufferedImage source, int targetW, int targetH, boolean equalProportion) { int type = source.getType(); BufferedImage target = null; double sx = (double) targetW / source.getWidth(); double sy = (double) targetH / source.getHeight(); if (equalProportion) { if (sx > sy) { sx = sy; targetW = (int) (sx * source.getWidth()); } else { sy = sx; targetH = (int) (sx * source.getHeight()); } } if (type == BufferedImage.TYPE_CUSTOM) { ColorModel cm = source.getColorModel(); WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH); boolean alphaPremultiplied = cm.isAlphaPremultiplied(); target = new BufferedImage(cm, raster, alphaPremultiplied, null); } else { target = new BufferedImage(targetW, targetH, type); Graphics2D g = target.createGraphics(); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy)); g.dispose(); } return target; } public static boolean strIsValid(String str) { return str != null && !str.trim().equals(""); } }