package cn.jcenterhome.util; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.awt.image.ImageProducer; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Map; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.swing.ImageIcon; public class ImageUtil { private static final boolean USE_TRANSFORM = false; public static String makeThumb(HttpServletRequest request, HttpServletResponse response, String srcImgPath) { Map<String, Object> settings = Common.getCacheDate(request, response, "/data/cache/cache_setting.jsp", "globalSetting"); int tow = (Integer) settings.get("thumbwidth"); int toh = (Integer) settings.get("thumbheight"); int maxtow = (Integer) settings.get("maxthumbwidth"); int maxtoh = (Integer) settings.get("maxthumbheight"); return makeThumb(request, response, srcImgPath, tow, toh, maxtow, maxtoh); } public static String makeThumb(HttpServletRequest request, HttpServletResponse response, String srcImgPath, int tow, int toh, int maxtow, int maxtoh) { File srcFile = new File(srcImgPath); if (!srcFile.exists()) { return null; } String destPath = srcImgPath + ".thumb.jpg"; File destFile = new File(destPath); if (tow < 60) { tow = 60; } if (toh < 60) { toh = 60; } boolean make_max = false; if (maxtow >= 300 && maxtoh >= 300) { make_max = true; } String srcImgType = Common.getImageType(srcFile); if ("gif".equals(srcImgType)) { make_max = false; } try { BufferedImage srcImg = ImageIO.read(srcFile); float src_w = srcImg.getWidth(); float src_h = srcImg.getHeight(); if (src_w <= maxtow && src_h <= maxtoh) make_max = false; float thumb_ratio = tow / toh; float src_ratio = src_w / src_h; if (thumb_ratio <= src_ratio) { toh = (int) (tow / src_ratio); maxtoh = (int) (maxtow * (src_h / src_w)); } else { tow = (int) (toh * src_ratio); maxtow = (int) (maxtoh * (src_w / src_h)); } if (src_w > tow || src_h > toh) { double x_ratio = (double) tow / src_w; double y_ratio = (double) toh / src_h; AffineTransform tx = new AffineTransform(); tx.setToScale(x_ratio, y_ratio); BufferedImage thumbImg = new BufferedImage(tow, toh, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = thumbImg.createGraphics(); if (USE_TRANSFORM) { g2d.drawImage(srcImg, tx, null); } else { Image scaleImg = getScaledInstance(srcImg, tow, toh); g2d.drawImage(scaleImg, 0, 0, null); } g2d.dispose(); ImageIO.write(thumbImg, "jpeg", destFile); if (make_max) { BufferedImage maxImg = new BufferedImage(maxtow, maxtoh, BufferedImage.TYPE_3BYTE_BGR); g2d = maxImg.createGraphics(); if (USE_TRANSFORM) { g2d.drawImage(srcImg, tx, null); } else { Image scaleImg = getScaledInstance(srcImg, maxtow, maxtoh); g2d.drawImage(scaleImg, 0, 0, null); } g2d.dispose(); ImageIO.write(maxImg, "jpeg", srcFile); } } } catch (IOException e) { return null; } return destFile.exists() ? destPath : null; } private static Image getScaledInstance(BufferedImage srcImage, int imageWidth, int imageHeight) { ImageFilter filter = new java.awt.image.AreaAveragingScaleFilter(imageWidth, imageHeight); ImageProducer prod = new FilteredImageSource(srcImage.getSource(), filter); Image newImage = Toolkit.getDefaultToolkit().createImage(prod); ImageIcon imageIcon = new ImageIcon(newImage); Image scaleImg = imageIcon.getImage(); return scaleImg; } public static void makeWaterMark(HttpServletRequest request, HttpServletResponse response, String srcImg) { try { File srcFile = new File(srcImg); String srcImgType = Common.getImageType(srcFile); if (srcImgType.equals("gif")) { byte[] bytes = new byte[1024]; FileInputStream fis = new FileInputStream(srcImg); fis.read(bytes); String srcContent = new String(bytes, JavaCenterHome.JCH_CHARSET); if (srcContent.indexOf("NETSCAPE2.0") != -1) { return; } } Map<String, Object> settings = Common.getCacheDate(request, response, "/data/cache/cache_setting.jsp", "globalSetting"); String wm = (String) settings.get("watermarkfile"); String waterMark = JavaCenterHome.jchRoot + (Common.empty(wm) ? "./image/watermark.png" : wm); Image water = ImageIO.read(new File(waterMark)); Image src = ImageIO.read(srcFile); int water_w = water.getWidth(null); int water_h = water.getHeight(null); int src_w = src.getWidth(null); int src_h = src.getHeight(null); if ((src_w < water_w + 150) || (src_h < water_h + 150)) { return; } int waterMarkPos = (Integer) settings.get("watermarkpos"); int x = 0, y = 0; switch (waterMarkPos) { case 1: x = 0; y = 0; break; case 2: x = src_w - water_w; y = 0; break; case 3: x = 0; y = src_h - water_h; break; case 4: x = src_w - water_w; y = src_h - water_h; break; default: x = Common.rand(0, src_w - water_w); y = Common.rand(0, src_h - water_h); } BufferedImage image = new BufferedImage(src_w, src_h, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); g2d.drawImage(src, 0, 0, src_w, src_h, null); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.7f)); g2d.drawImage(water, x, y, water_w, water_h, null); g2d.dispose(); ImageIO.write(image, srcImgType, srcFile); } catch (IOException e) { return; } } }