|
@@ -0,0 +1,138 @@
|
|
|
+package cn.com.qmth.stmms.ms.admin.utils;
|
|
|
+
|
|
|
+import javax.imageio.IIOImage;
|
|
|
+import javax.imageio.ImageIO;
|
|
|
+import javax.imageio.ImageWriteParam;
|
|
|
+import javax.imageio.ImageWriter;
|
|
|
+import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
|
|
|
+import javax.imageio.stream.FileImageOutputStream;
|
|
|
+import java.awt.*;
|
|
|
+import java.awt.geom.Rectangle2D;
|
|
|
+import java.awt.image.BufferedImage;
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by yuanpan on 2017/12/13.
|
|
|
+ */
|
|
|
+public class WaterMarkUtils {
|
|
|
+
|
|
|
+
|
|
|
+ public static void addTextWatermark(String text, String type, String sourcePath, String destinationPath) throws IOException {
|
|
|
+ File source = new File(sourcePath);
|
|
|
+ File destination = new File(destinationPath);
|
|
|
+ BufferedImage image = ImageIO.read(source);
|
|
|
+ int width = image.getWidth();
|
|
|
+ int height = image.getHeight();
|
|
|
+
|
|
|
+ // determine image type and handle correct transparency
|
|
|
+ //int imageType = "png".equalsIgnoreCase(type) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB;
|
|
|
+ BufferedImage watermarked = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
|
|
|
+
|
|
|
+ // initializes necessary graphic properties
|
|
|
+ Graphics2D w = (Graphics2D) watermarked.getGraphics();
|
|
|
+ w.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
|
|
+ w.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
|
|
+
|
|
|
+ w.drawImage(image.getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH), 0, 0, null);
|
|
|
+ AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f);
|
|
|
+ w.setComposite(alphaChannel);
|
|
|
+ w.setColor(Color.red);
|
|
|
+ w.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 60));
|
|
|
+ FontMetrics fontMetrics = w.getFontMetrics();
|
|
|
+ Rectangle2D rect = fontMetrics.getStringBounds(text, w);
|
|
|
+
|
|
|
+ // calculate center of the image
|
|
|
+// int x = (image.getWidth() - (int) rect.getWidth()) / 2;
|
|
|
+// int y = image.getHeight() / 2;
|
|
|
+
|
|
|
+ int x = 0;
|
|
|
+ int y = image.getHeight() - (int) rect.getHeight() + 50;
|
|
|
+
|
|
|
+ // add text overlay to the image
|
|
|
+ w.drawString(text, x, y);
|
|
|
+ //ImageIO.write(watermarked, type, destination);
|
|
|
+ //w.dispose();
|
|
|
+
|
|
|
+
|
|
|
+ JPEGImageWriteParam jepgParams = new JPEGImageWriteParam(null);
|
|
|
+ jepgParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
|
|
+ jepgParams.setCompressionQuality(1f);
|
|
|
+ final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
|
|
|
+ writer.setOutput(new FileImageOutputStream(destination));
|
|
|
+ writer.write(null, new IIOImage(watermarked, null, null), jepgParams);
|
|
|
+ writer.dispose();
|
|
|
+
|
|
|
+
|
|
|
+ w.dispose();
|
|
|
+
|
|
|
+
|
|
|
+// FileOutputStream fos = new FileOutputStream(destination);
|
|
|
+// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
|
|
|
+// encoder.encode(watermarked);
|
|
|
+// fos.flush();
|
|
|
+// fos.close();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param srcImgPath 源图片路径
|
|
|
+ * @param tarImgPath 保存的图片路径
|
|
|
+ * @param waterMarkContent 水印内容
|
|
|
+ * @param markContentColor 水印颜色
|
|
|
+ * @param font 水印字体
|
|
|
+ */
|
|
|
+ public static void addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent, Color markContentColor, Font font) {
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 读取原图片信息
|
|
|
+ File srcImgFile = new File(srcImgPath);//得到文件
|
|
|
+ Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
|
|
|
+ int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
|
|
|
+ int srcImgHeight = srcImg.getHeight(null);//获取图片的高
|
|
|
+ // 加水印
|
|
|
+ BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
|
|
|
+ Graphics2D g = bufImg.createGraphics();
|
|
|
+ g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
|
|
|
+ g.setColor(markContentColor); //根据图片的背景设置水印颜色
|
|
|
+ g.setFont(font); //设置字体
|
|
|
+
|
|
|
+ //设置水印的坐标
|
|
|
+// int x = srcImgWidth - getWatermarkWidth(waterMarkContent, g);
|
|
|
+// int y = getWatermarkHeight(g);
|
|
|
+ int x = 0;
|
|
|
+ int y = srcImgHeight - getWatermarkHeight(g) + 50;
|
|
|
+// int y = srcImgHeight;
|
|
|
+ g.drawString(waterMarkContent, x, y); //画出水印
|
|
|
+ g.dispose();
|
|
|
+ // 输出图片
|
|
|
+ FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
|
|
|
+ ImageIO.write(bufImg, "jpg", outImgStream);
|
|
|
+ System.out.println("添加水印完成");
|
|
|
+ outImgStream.flush();
|
|
|
+ outImgStream.close();
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ // TODO: handle exception
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int getWatermarkWidth(String waterMarkContent, Graphics2D g) {
|
|
|
+ return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int getWatermarkHeight(Graphics2D g) {
|
|
|
+ return g.getFontMetrics(g.getFont()).getHeight();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Font font = new Font("Symbol", Font.PLAIN, 60); //水印字体
|
|
|
+ String srcImgPath = "/Users/yuanpan/tmp/1842030001.jpg"; //源图片地址
|
|
|
+ String tarImgPath = "/Users/yuanpan/tmp/1842030002.jpg"; //待存储的地址
|
|
|
+ String waterMarkContent = "90分"; //水印内容
|
|
|
+ Color color = new Color(254, 3, 10, 255); //水印图片色彩以及透明度
|
|
|
+ WaterMarkUtils.addWaterMark(srcImgPath, tarImgPath, waterMarkContent, color, font);
|
|
|
+
|
|
|
+ }
|
|
|
+}
|