Java实现给图片添加水印

清疚 2022-06-06 11:00 659阅读 0赞

原文转载自:http://blog.csdn.net/dy\_smile/article/details/6722907 ,有做部分修改

给图片添加图片/文字水印(源图片必须要比水印图片大)

  1. package com.demo.demo;
  2. import java.awt.AlphaComposite;
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics2D;
  6. import java.awt.Image;
  7. import java.awt.RenderingHints;
  8. import java.awt.font.TextAttribute;
  9. import java.awt.image.BufferedImage;
  10. import java.io.File;
  11. import java.io.FileOutputStream;
  12. import java.io.OutputStream;
  13. import java.text.AttributedCharacterIterator;
  14. import java.text.AttributedString;
  15. import javax.imageio.ImageIO;
  16. import javax.swing.ImageIcon;
  17. import com.sun.image.codec.jpeg.JPEGCodec;
  18. import com.sun.image.codec.jpeg.JPEGEncodeParam;
  19. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  20. /**
  21. * 图片水印Demo
  22. * @author thinkpad
  23. *
  24. */
  25. public class ImageMarkLogoByIcon {
  26. public static void main(String[] args) {
  27. String srcImgPath = "C:\\Users\\thinkpad\\Desktop\\timg.jpg";
  28. String iconPath = "C:\\Users\\thinkpad\\Desktop\\waterMarking.png";
  29. String targerPath = "C:\\Users\\thinkpad\\Desktop\\水印测试.png";
  30. String targerPath2 = "C:\\Users\\thinkpad\\Desktop\\img_mark_icon_rotate.jpg";
  31. //水印内容
  32. String waterMarkContent="图片来源:http://www.baidu.com";
  33. //水印图片色彩以及透明度
  34. Color color=new Color(255,255,255,128);
  35. //水印字体
  36. Font font = new Font("微软雅黑", Font.PLAIN, 35);
  37. // 给图片添加水印
  38. // ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath);
  39. // 给图片添加水印,水印旋转-45
  40. // ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath2,
  41. // -45);
  42. //给图片添加文字水印
  43. ImageMarkLogoByIcon.addTextWaterMark(srcImgPath,targerPath, waterMarkContent, color,font);
  44. }
  45. /**
  46. * 给图片添加水印
  47. * @param iconPath 水印图片路径
  48. * @param srcImgPath 源图片路径
  49. * @param targerPath 目标图片路径
  50. */
  51. public static void markImageByIcon(String iconPath, String srcImgPath,
  52. String targerPath) {
  53. markImageByIcon(iconPath, srcImgPath, targerPath, null);
  54. }
  55. /**
  56. * 给图片添加水印、可设置水印图片旋转角度
  57. * @param iconPath 水印图片路径
  58. * @param srcImgPath 源图片路径
  59. * @param targerPath 目标图片路径
  60. * @param degree 水印图片旋转角度
  61. */
  62. public static void markImageByIcon(String iconPath, String srcImgPath,
  63. String targerPath, Integer degree) {
  64. OutputStream os = null;
  65. try {
  66. Image srcImg = ImageIO.read(new File(srcImgPath));
  67. BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
  68. srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  69. // 得到画笔对象
  70. // Graphics g= buffImg.getGraphics();
  71. Graphics2D g = buffImg.createGraphics();
  72. // 设置对线段的锯齿状边缘处理
  73. g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
  74. RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  75. g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg
  76. .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
  77. if (null != degree) {
  78. // 设置水印旋转
  79. g.rotate(Math.toRadians(degree),
  80. (double) buffImg.getWidth() / 2, (double) buffImg
  81. .getHeight() / 2);
  82. }
  83. // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
  84. ImageIcon imgIcon = new ImageIcon(iconPath);
  85. // 得到Image对象。
  86. Image img = imgIcon.getImage();
  87. // float alpha = 0.5f; // 透明度 (数值越大,透明度越小)
  88. float alpha = 1f; // 透明度
  89. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  90. alpha));
  91. // 表示水印图片的位置
  92. int iconWidth = img.getWidth(null); //水印图片宽度
  93. int iconHeight = img.getHeight(null); //水印图片高度
  94. // g.drawImage(img, 水印位置的横坐标, 水印位置的纵坐标,水印宽度, 水印高度, null);
  95. g.drawImage(img, buffImg.getWidth() - iconWidth, buffImg.getHeight() -iconHeight ,
  96. iconWidth, iconHeight, null);
  97. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
  98. g.dispose();
  99. os = new FileOutputStream(targerPath);
  100. // 生成图片
  101. ImageIO.write(buffImg, "JPG", os);
  102. System.out.println("图片完成添加Icon印章。。。。。。");
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. } finally {
  106. try {
  107. if (null != os)
  108. os.close();
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. }
  112. }
  113. }
  114. /**
  115. * 给图片添加文字水印
  116. * @param srcImgPath 源图片路径
  117. * @param tarImgPath 保存的图片路径
  118. * @param waterMarkContent 水印内容
  119. * @param markContentColor 水印颜色
  120. * @param font 水印字体
  121. */
  122. public static void addTextWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent,Color markContentColor,Font font) {
  123. try {
  124. // 读取原图片信息
  125. File srcImgFile = new File(srcImgPath);//得到文件
  126. Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
  127. int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
  128. int srcImgHeight = srcImg.getHeight(null);//获取图片的高
  129. // 加水印
  130. BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
  131. Graphics2D g = bufImg.createGraphics();
  132. g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
  133. g.setColor(markContentColor); //根据图片的背景设置水印颜色
  134. g.setFont(font); //设置字体
  135. //设置水印的坐标
  136. int x = srcImgWidth - 2 * getWatermarkLength(waterMarkContent, g);
  137. int y = srcImgHeight - getWatermarkLength(waterMarkContent, g);
  138. System.out.println("源图宽度:"+srcImgWidth+" ,高度:"+srcImgHeight);
  139. System.out.println("水印宽度:"+getWatermarkLength(waterMarkContent, g)+" ,高度:"+getWatermarkLength(waterMarkContent, g));
  140. System.out.println("水印坐标的X轴:"+x+" ,Y轴:"+y);
  141. g.drawString(waterMarkContent, x, y); //画出水印
  142. g.dispose();
  143. // 输出图片
  144. FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
  145. ImageIO.write(bufImg, "jpg", outImgStream);
  146. System.out.println("添加水印完成");
  147. outImgStream.flush();
  148. outImgStream.close();
  149. } catch (Exception e) {
  150. // TODO: handle exception
  151. }
  152. }
  153. public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
  154. return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
  155. }
  156. }

发表评论

表情:
评论列表 (有 0 条评论,659人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java图片添加文字水印

    闲着没事,研究了下图片水印的事儿,图片水印虽然恶心,而且大大的影响了图片的美观,试想一下,一张美女的性感写真照,下方来了个大大的水印“XXXX所有”,看着那猥琐的文字水印,是不

    相关 PHP图片添加水印

    首先需要PHP安装gd库,一般默认会给自动安装,大家放心! [demo下载、包含其他的一些处理图片的类:上传、缩略图、检查是否合法等][demo] 接下来直接上de