Hi各位,我是树林子,一个工作两年的程序员。

最近接收到一个开发任务,给照片添加水印功能,最开始是一条对角线的水印,做完后被否掉了,要求平铺,查来查去走了不少坑,所以决定写一篇对小白超级友好,巨详细的文章。

第一种原图:

第一种效果图:

如果以上是你想找的,话不多说,抓紧往下看!!!!!!

调用:

        //1、水印文字String logoText = "这只是一个水印 SMALLGROVE";//2、获取原始图片路径(我这里只写了本地图片路径,还有一种是从服务器的归档文件中获取)String srcImgPath = "d:/srcImg.png"; //3、目标图片路径(加完水印之后的图片,要存放的路径,随便起的名字)String targetPath = "d:/targetImg.png";//4、给图片添加水印文字(logoText水印内容,srcImgPath原图片路径,targerPath目标图片路径)markImageByText(logoText, srcImgPath, targetPath);

水印处理的方法:

     /*** 给图片添加水印文字、可设置水印文字的大小、旋转角度、透明度* @param logoText  水印内容* @param srcImgPath  原图片路径* @param targetImgPath  目标图片路径*/public void markImageByText(String logoText, String srcImgPath,String targetImgPath) throws IOException {debugLog("图片开始添加水印文字");// 1、读取源图片,Image获取图片宽度、高度Image scrImg = ImageIO.read(new File(srcImgPath));BufferedImage buffImg = new BufferedImage(scrImg.getWidth(null), scrImg.getHeight(null), BufferedImage.TYPE_INT_RGB);// 2、得到画笔对象Graphics2D graphics = buffImg.createGraphics();// 3、设置对线段的锯齿状边缘处理graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics.drawImage(scrImg.getScaledInstance(scrImg.getWidth(null), scrImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);// 4、设置水印倾斜度,这里是在图片的对角线上// 对角线长度lengthOfDiagonaldouble lengthOfDiagonal = Math.sqrt(Math.pow(buffImg.getWidth(),2) + Math.pow(buffImg.getHeight(),2));double v = (Math.pow(buffImg.getWidth(), 2) + Math.pow(lengthOfDiagonal, 2) - Math.pow(buffImg.getHeight(), 2)) / (2 * buffImg.getWidth() * lengthOfDiagonal);//get到了一个弧度数double acos = Math.acos(v); double myDegree = Math.toDegrees(acos);//这里的负号决定对角线-Math.toRadians(myDegree)graphics.rotate(-Math.toRadians(myDegree),(double) buffImg.getWidth() / 2,(double) buffImg.getHeight() / 2);// 5、设置水印文字颜色graphics.setColor(Color.RED);// 6、获取源图片的宽度和高度int width = scrImg.getWidth(null);int heigth = scrImg.getHeight(null);// 7、设置水印文字大小(根据原图的宽、高度,我这里是哪个长就取哪个,再除上水印字符串长度,记为size)int size = 0;if (width >= heigth) {size = width / logoText.length();} else {size = heigth / logoText.length();}//Font是JAVA中的字体类,PLAIN:普通样式常量;BOLD:粗体样式常量;ITALIC:斜体样式常量//如下初始化对象:Font font = new Font("宋体" , Font.BOLD , 23);该字体表示23磅粗体的宋体字graphics.setFont(new Font("宋体", Font.PLAIN, size));//8、设置透明度graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,0.3f));//9、设置文字位置FontDesignMetrics metrics = FontDesignMetrics.getMetrics(graphics.getFont());//获取文字宽度int strWidth = metrics.stringWidth(logoText);int strHeight = metrics.getHeight();//文字在画布上的坐标int left = (width - strWidth) / 2; //有条基线,加上ascent,相当于画布要向上移动(或是文字向下移),才能保证文字是居中的int top = (heigth - strHeight) / 2 + metrics.getAscent(); //10、水印文字开始动工了,文字内容,x,y坐标graphics.drawString(logoText, left, top);//11、释放资源graphics.dispose();//12、生成图片try {OutputStream os = null;os = new FileOutputStream(targetImgPath);ImageIO.write(buffImg, "png", os);} catch (FileNotFoundException e) {e.printStackTrace();}debugLog("图片完成添加水印文字");}

第二种原图:

第二种效果图:

  /*** 给图片添加水印文字、可设置水印文字的大小、旋转角度、透明度** @param logoText   水印内容* @param srcImgPath 原图片路径* @param targerPath 目标图片路径*/public void markImageByText(String logoText, String srcImgPath,String targerPath) throws IOException {debugLog("图片开始添加水印文字");// 1、读取源图片,Image获取图片宽度、高度Image scrImg = ImageIO.read(new File(srcImgPath));BufferedImage buffImg = new BufferedImage(scrImg.getWidth(null), scrImg.getHeight(null), BufferedImage.TYPE_INT_RGB);// 2、得到画笔对象Graphics2D graphics = buffImg.createGraphics();// 3、设置对线段的锯齿状边缘处理graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics.drawImage(scrImg.getScaledInstance(scrImg.getWidth(null), scrImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);// 4、设置水印倾斜度,这里是在图片的对角线上// 对角线长度lengthOfDiagonaldouble lengthOfDiagonal = Math.sqrt(Math.pow(buffImg.getWidth(), 2) + Math.pow(buffImg.getHeight(), 2));double v = (Math.pow(buffImg.getWidth(), 2) + Math.pow(lengthOfDiagonal, 2) - Math.pow(buffImg.getHeight(), 2)) / (2 * buffImg.getWidth() * lengthOfDiagonal);//get到了一个弧度数double acos = Math.acos(v);double myDegree = Math.toDegrees(acos);//这里的负号决定对角线-Math.toRadians(myDegree)graphics.rotate(-Math.toRadians(myDegree),(double) buffImg.getWidth() / 2,(double) buffImg.getHeight() / 2);// 5、设置水印文字颜色graphics.setColor(Color.DARK_GRAY);// 6、获取源图片的宽度和高度int width = scrImg.getWidth(null);int heigth = scrImg.getHeight(null);graphics.setFont(new Font("微软雅黑", Font.BOLD, 50));//8、设置透明度graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,0.2f));//9、设置文字位置FontDesignMetrics metrics = FontDesignMetrics.getMetrics(graphics.getFont());//获取文字宽度int strWidth = metrics.stringWidth(logoText);int xNum = width / strWidth + 1;int yNum = heigth / 50 + 1;int split = 50;for (int i = 1; i <= 2 * yNum; i++) {int y = -heigth + 50 * i + 5 * split * i;for (int j = 0; j < xNum; j++) {int x = strWidth * j + 3 * split * j;graphics.drawString(logoText, x, y);}}//11、释放资源graphics.dispose();//12、生成图片try {OutputStream os = null;os = new FileOutputStream(targerPath);ImageIO.write(buffImg, "jpg", os);} catch (FileNotFoundException e) {e.printStackTrace();}debugLog("图片完成添加水印文字");}

平时会更一些日常工作中遇到的问题,以此来记录自己的成长。

下期见面!Bye!

JAVA添加水印,平铺和斜对角线我都有!相关推荐

  1. 游戏建模 | 适用于设计师制作平铺材质(Zbrush砖石平铺)

    在我们次世代场景案例制作中,会大量使用到四方连续的平铺贴图.在传统方法中,可以使用照片在PS中位移制作得出.或者是其他软件如B2M等自动制作平铺效果.这种方法有一定的缺陷首先照片素材要求高,找不到合适 ...

  2. 在Java生成的html页面加水印,Java在Excel中添加水印的实现(单一水印、平铺水印)...

    在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...

  3. Java实现图片水印文字换行、平铺、旋转效果

    Java代码实现对图片的水印文字的添加. 水印的效果是:水印文字的换行.水印文字的平铺.水印文字的旋转. import java.awt.Color; import java.awt.Font; im ...

  4. java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/duan1309/article/details/81232300 因项目需要将word文件(.doc ...

  5. Java 在PPT中添加文本水印的简易方法(单一/平铺水印)

    [前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...

  6. java实现图片平铺倾斜水印效果--转载

    转载地址--java实现图片平铺倾斜水印效果_java_clh的博客-CSDN博客_java图片平铺 效果图: public static void main(String[] args) throw ...

  7. Java 设置PDF平铺图片背景(水印)

    一.概述及环境准备 本文介绍使用免费版PDF库-Free Spire.PDF for Java加载图片来设置成PDF平铺图片背景的效果,也可以作为平铺图片水印来使用:编辑代码前,需要先导入jar文件, ...

  8. java 背景图片自适应_java 背景图片随窗口大小变化进行自动缩放及平铺 | 学步园...

    最近一直被这个问题困扰这,上网也搜了不少这方面的知识,发现很多人都说用reapint方法(很简单的)进行图片重绘就OK了(没源码),于是乎至今也没实现 但通过自己的摸索也确实学到了不少东东滴! 在看代 ...

  9. Java实现pdf文件添加水印,铺满全页。

    因项目需要将word文件(.doc,.docx,.rtf)转换成pdf文件并添加水印,铺满全页. 现就将为pdf文件添加水印提取出来,word文件转换成pdf文件,网上的教程很多,如需需要联系我即可. ...

最新文章

  1. Salesforce Lightning开发学习(二)Component组件开发实践
  2. linux实验磁盘管理,从0到1学习网络安全 【Linux实验篇-LVM 磁盘管理】
  3. H5新特性 input type=date 在手机上默认提示显示无效解决办法
  4. 1. 列维过程的混沌及可料表示(1)
  5. android通过代码设置铃声_第六十四回:Android中UI控件之SeekBar
  6. mysql or优化_MySQL 语句优化
  7. Spring Boot 高效入门实战
  8. linux 文件乱码_RedHatlinux系统虚机启动后/etc/fstab中的文件系统未能挂载上
  9. 几个用于更精细判断敛散性的级数
  10. vbs if 不等于_(四)if 判断与逻辑运算符
  11. 地址省市县三级联动------数据库设计
  12. JS信用卡真实利率计算器
  13. 4k电视测试软件64,2017年四款看4k视频软件推荐,智能电视必备!
  14. [异步图书].Python机器学习:预测分析核心算法.pdf
  15. 74HC138 三八译码器
  16. linux ov7725模块驱动,stm32f4 驱动ov7725摄像头,使用dcmi一直无法产生中断
  17. 【问题记录与解决】jupyter notebook 无法重命名,无法运行测试代码 || jupyter notebook 中常用的两个快捷键。
  18. 盲盒小程序的开发功能介绍,优势有哪些
  19. php 计算百分比,百分比计算器
  20. 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第3部分

热门文章

  1. 网络爬虫 测试代理IP
  2. 基于PHP的人才招聘网站设计
  3. paddle.fluid.io.xmap_readers
  4. node ncc 打包
  5. 【疯壳·无人机开发教程1】开源编队无人机-开机测试
  6. Latex实践:一个零Latex基础的术渣花了一天半的时间用Latex完成一篇SCI论文编辑
  7. C++语言学习(八)——操作符重载
  8. ssh 连接其他服务器
  9. 24.STM32的IO口扩展PCF8574
  10. 物流小程序设计开发的功能明细与方案