java实现给图片添加水印

妖狐艹你老母 2022-08-07 09:59 523阅读 0赞

我喜欢先有思路再说实现,大家都知道java可以画图的,但效率不是很高,我们又不用它写ps软件,哈哈啊哈。。。。。

转载留下出处哈:http://blog.csdn.net/zengshunyao/article/details/44758297

首先。涉及到文件就要用到文件操作,但我们这是操作图片
1、我们首先需要一个容器来存放图片ps:图片原来在磁盘(File)——》内存(image)
2、我们要在原来的图片上加水印,就相当于要在纸上画画。。。所以我们的画纸应该是原图的一的副本,我们我们需要得到副本并用容器容乃他,
3、画画需要画笔对吧,我们要得到画副本的笔,当然笔肯定有粗细。。。参数设置。。
4、现在就开始画了。。。首先的找位置。。。我们的图片就像桌面是二维图形,就用起始坐标,还是按部就班就从(0,0)开始呢

5、然后万一我们想斜着画了呢,java有旋转画布的方法
6、开始画画了。。。。给定位置。。。给定内容。。下笔了。。。(一阵乱糊)
7、花完了。。是不是就要收拾现场了。。。。收拾好笔,将内存的image输出到磁盘文件。。。。
上代码

  1. package com.funi.test;
  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.image.BufferedImage;
  9. import java.io.File;
  10. import java.io.FileOutputStream;
  11. import java.io.InputStream;
  12. import java.io.OutputStream;
  13. import javax.imageio.ImageIO;
  14. import javax.swing.ImageIcon;
  15. /*******************************************************************************
  16. * Description: 图片水印工具类
  17. * @author zengshunyao
  18. * @version 1.0
  19. */
  20. public class ImageRemarkUtil {
  21. // 水印透明度
  22. private static float alpha = 0.5f;
  23. // 水印横向位置
  24. private static int positionWidth = 150;
  25. // 水印纵向位置
  26. private static int positionHeight = 300;
  27. // 水印文字字体
  28. private static Font font = new Font("宋体", Font.BOLD, 72);
  29. // 水印文字颜色
  30. private static Color color = Color.red;
  31. /**
  32. *
  33. * @param alpha
  34. * 水印透明度
  35. * @param positionWidth
  36. * 水印横向位置
  37. * @param positionHeight
  38. * 水印纵向位置
  39. * @param font
  40. * 水印文字字体
  41. * @param color
  42. * 水印文字颜色
  43. */
  44. public static void setImageMarkOptions(float alpha, int positionWidth,
  45. int positionHeight, Font font, Color color) {
  46. if (alpha != 0.0f)
  47. ImageRemarkUtil.alpha = alpha;
  48. if (positionWidth != 0)
  49. ImageRemarkUtil.positionWidth = positionWidth;
  50. if (positionHeight != 0)
  51. ImageRemarkUtil.positionHeight = positionHeight;
  52. if (font != null)
  53. ImageRemarkUtil.font = font;
  54. if (color != null)
  55. ImageRemarkUtil.color = color;
  56. }
  57. /**
  58. * 给图片添加水印图片
  59. *
  60. * @param iconPath
  61. * 水印图片路径
  62. * @param srcImgPath
  63. * 源图片路径
  64. * @param targerPath
  65. * 目标图片路径
  66. */
  67. public static void markImageByIcon(String iconPath, String srcImgPath,
  68. String targerPath) {
  69. markImageByIcon(iconPath, srcImgPath, targerPath, null);
  70. }
  71. /**
  72. * 给图片添加水印图片、可设置水印图片旋转角度
  73. *
  74. * @param iconPath
  75. * 水印图片路径
  76. * @param srcImgPath
  77. * 源图片路径
  78. * @param targerPath
  79. * 目标图片路径
  80. * @param degree
  81. * 水印图片旋转角度
  82. */
  83. public static void markImageByIcon(String iconPath, String srcImgPath,
  84. String targerPath, Integer degree) {
  85. OutputStream os = null;
  86. try {
  87. Image srcImg = ImageIO.read(new File(srcImgPath));
  88. BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
  89. srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  90. // 1、得到画笔对象
  91. Graphics2D g = buffImg.createGraphics();
  92. // 2、设置对线段的锯齿状边缘处理
  93. g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
  94. RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  95. g.drawImage(
  96. srcImg.getScaledInstance(srcImg.getWidth(null),
  97. srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
  98. null);
  99. // 3、设置水印旋转
  100. if (null != degree) {
  101. g.rotate(Math.toRadians(degree),
  102. (double) buffImg.getWidth() / 2,
  103. (double) buffImg.getHeight() / 2);
  104. }
  105. // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
  106. ImageIcon imgIcon = new ImageIcon(iconPath);
  107. // 5、得到Image对象。
  108. Image img = imgIcon.getImage();
  109. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  110. alpha));
  111. // 6、水印图片的位置
  112. g.drawImage(img, positionWidth, positionHeight, null);
  113. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
  114. // 7、释放资源
  115. g.dispose();
  116. // 8、生成图片
  117. os = new FileOutputStream(targerPath);
  118. ImageIO.write(buffImg, "JPG", os);
  119. System.out.println("图片完成添加水印图片");
  120. } catch (Exception e) {
  121. e.printStackTrace();
  122. } finally {
  123. try {
  124. if (null != os)
  125. os.close();
  126. } catch (Exception e) {
  127. e.printStackTrace();
  128. }
  129. }
  130. }
  131. /**
  132. * 给图片添加水印文字
  133. *
  134. * @param logoText
  135. * 水印文字
  136. * @param srcImgPath
  137. * 源图片路径
  138. * @param targerPath
  139. * 目标图片路径
  140. */
  141. public static void markImageByText(String logoText, String srcImgPath,
  142. String targerPath) {
  143. markImageByText(logoText, srcImgPath, targerPath, null);
  144. }
  145. /**
  146. * 给图片添加水印文字、可设置水印文字的旋转角度
  147. *
  148. * @param logoText
  149. * @param srcImgPath
  150. * @param targerPath
  151. * @param degree
  152. */
  153. public static void markImageByText(String logoText, String srcImgPath,
  154. String targerPath, Integer degree) {
  155. InputStream is = null;
  156. OutputStream os = null;
  157. try {
  158. // 1、源图片
  159. Image srcImg = ImageIO.read(new File(srcImgPath));
  160. BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
  161. srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  162. // 2、得到画笔对象
  163. Graphics2D g = buffImg.createGraphics();
  164. // 3、设置对线段的锯齿状边缘处理
  165. g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
  166. RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  167. g.drawImage(
  168. srcImg.getScaledInstance(srcImg.getWidth(null),
  169. srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
  170. null);
  171. // 4、设置水印旋转
  172. if (null != degree) {
  173. g.rotate(Math.toRadians(degree),
  174. (double) buffImg.getWidth() / 2,
  175. (double) buffImg.getHeight() / 2);
  176. }
  177. // 5、设置水印文字颜色
  178. g.setColor(color);
  179. // 6、设置水印文字Font
  180. g.setFont(font);
  181. // 7、设置水印文字透明度
  182. g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  183. alpha));
  184. // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
  185. g.drawString(logoText, positionWidth, positionHeight);
  186. // 9、释放资源
  187. g.dispose();
  188. // 10、生成图片
  189. os = new FileOutputStream(targerPath);
  190. ImageIO.write(buffImg, "JPG", os);
  191. System.out.println("图片完成添加水印文字");
  192. } catch (Exception e) {
  193. e.printStackTrace();
  194. } finally {
  195. try {
  196. if (null != is)
  197. is.close();
  198. } catch (Exception e) {
  199. e.printStackTrace();
  200. }
  201. try {
  202. if (null != os)
  203. os.close();
  204. } catch (Exception e) {
  205. e.printStackTrace();
  206. }
  207. }
  208. }
  209. public static void main(String[] args) {
  210. String srcImgPath = "d:/1.jpg";
  211. String logoText = "复 印 无 效";
  212. String iconPath = "d:/2.jpg";
  213. String targerTextPath = "d:/qie_text.jpg";
  214. String targerTextPath2 = "d:/qie_text_rotate.jpg";
  215. String targerIconPath = "d:/qie_icon.jpg";
  216. String targerIconPath2 = "d:/qie_icon_rotate.jpg";
  217. System.out.println("给图片添加水印文字开始...");
  218. // 给图片添加水印文字
  219. markImageByText(logoText, srcImgPath, targerTextPath);
  220. // 给图片添加水印文字,水印文字旋转-45
  221. markImageByText(logoText, srcImgPath, targerTextPath2, -45);
  222. System.out.println("给图片添加水印文字结束...");
  223. System.out.println("给图片添加水印图片开始...");
  224. setImageMarkOptions(0.3f, 1, 1, null, null);
  225. // 给图片添加水印图片
  226. markImageByIcon(iconPath, srcImgPath, targerIconPath);
  227. // 给图片添加水印图片,水印图片旋转-45
  228. markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45);
  229. System.out.println("给图片添加水印图片结束...");
  230. }
  231. }

请对别人知识的尊重,http://blog.csdn.net/zengshunyao/article/details/44758297

发表评论

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

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

相关阅读

    相关 Java图片添加文字水印

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

    相关 PHP图片添加水印

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