首页 > 编程语言 >Java 生成水印图片

Java 生成水印图片

时间:2023-04-11 19:13:55浏览次数:53  
标签:Java text float param 生成 width g2d 水印

Java 生成水印图片
原文链接:https://blog.csdn.net/qq_42151956/article/details/121976565

工具类返回 BufferedImage, 写入文件生成水印图片,可见代码

一、核心代码

  1. /**
  2. * 生成背景透明的 文字水印
  3. *
  4. * @param width 生成图片宽度
  5. * @param height 生成图片高度
  6. * @param text 水印文字
  7. * @param color 颜色对象
  8. * @param font awt字体
  9. * @param degree 水印文字旋转角度
  10. * @param alpha 水印不透明度0f-1.0f
  11. * @param imagePath 图片地址
  12. */
  13. public static BufferedImage waterMarkByText(int width, int height, String text, Color color, Font font, Double degree, float alpha, String imagePath) {
  14. BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  15. // 得到画笔对象
  16. Graphics2D g2d = buffImg.createGraphics();
  17. // 增加下面的代码使得背景透明
  18. buffImg = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
  19. g2d.dispose();
  20. g2d = buffImg.createGraphics();
  21. // 设置对线段的锯齿状边缘处理
  22. g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  23. //把源图片写入
  24. if (imagePath != null && !imagePath.equals("")) {
  25. try {
  26. Image srcImg = ImageIO.read(new File(imagePath));
  27. Image image = srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH);
  28. g2d.drawImage(image, 0, 0, null);
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. // 设置水印旋转
  34. if (null != degree) {
  35. //注意rotate函数参数theta,为弧度制,故需用Math.toRadians转换一下
  36. //以矩形区域中央为圆心旋转
  37. g2d.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
  38. }
  39. // 设置颜色
  40. g2d.setColor(color);
  41. // 设置 Font
  42. g2d.setFont(font);
  43. // 设置透明度:1.0f为透明度 ,值从0-1.0,依次变得不透明
  44. g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
  45. // 获取真实宽度
  46. float realWidth = getRealFontWidth(text);
  47. float fontSize = font.getSize();
  48. // 计算绘图偏移x、y,使得使得水印文字在图片中居中,x、y坐标是基于Graphics2D.rotate过后的坐标系
  49. float x = 0.5f * width - 0.5f * fontSize * realWidth;
  50. float y = 0.5f * height + 0.5f * fontSize;
  51. // 取绘制的字串宽度、高度中间点进行偏移,使得文字在图片坐标中居中
  52. g2d.drawString(text, x, y);
  53. // 释放资源
  54. g2d.dispose();
  55. return buffImg;
  56. }
  57. /**
  58. * 获取真实字符串宽度,ascii字符占用0.5,中文字符占用1.0
  59. *
  60. * @param text 文字
  61. * @return 宽度
  62. */
  63. private static float getRealFontWidth(String text) {
  64. int len = text.length();
  65. float width = 0f;
  66. for (int i = 0; i < len; i++) {
  67. if (text.charAt(i) < 256) {
  68. width += 0.5f;
  69. } else {
  70. width += 1.0f;
  71. }
  72. }
  73. return width;
  74. }

二、测试

  1. /**
  2. * 测试
  3. *
  4. * @param markImagePath 水印图片目标地址
  5. */
  6. public static void test(String markImagePath) {
  7. try {
  8. BufferedImage bi = waterMarkByText("测试水印~,");
  9. ImageIO.write(bi, "png", new File(markImagePath));
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. }

三、结果

水印图片如下:由于背景白色,后附一张win 11 预览图

原生水印图片

win11 预览截图

标签:Java,text,float,param,生成,width,g2d,水印
From: https://www.cnblogs.com/sunny3158/p/17307316.html

相关文章

  • 基于Matlab的数字水印设计——基于空域的水印处理系统
    基于Matlab的数字水印设计——基于空域的水印处理系统原文链接:https://blog.csdn.net/yl624624/article/details/119966213MATLAB数字水印处理系统【LSB,界面GUI】摘要数字水印(DigitalWatermarking)技术是我们生活中经常见到的信息隐藏技术。它将一些标识信息(即数字水印......
  • 数字水印_最低有效位算法
    数字水印_最低有效位算法原文链接:https://blog.csdn.net/chengfenglee/article/details/123771536最低有效位(LeastSignificantBit.,LSB)指的是一个二进制数中的第0位(即最低位)最低有效位信息隐藏指的是,将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位,即将载......
  • 空域图像水印技术
    空域图像水印技术原文链接:https://cooc.cqmu.edu.cn/Course/KnowledgePoint/16102.aspx?AspxAutoDetectCookieSupport=1 空域图像水印技术是指在图像的空间域中嵌入水印的技术,它是较早的也是较为简单的数字水印技术。它通过直接修改图像的像素值来进行水印的嵌入。主要的方法有......
  • umeditor粘贴图片自动上传到服务器(Java版)
    ​ 当前功能基于PHP,其它语言流程大致相同 1.新增上传wordjson配置在ueditor\php\config.json中新增如下配置:     /* 上传word配置 */    "wordActionName":"wordupload",/* 执行上传视频的action名称 */    "wordFieldName":"upfile",/* 提交的......
  • 在网页中写javascript
    在网页中写Javascript1.在网页中直接嵌入<scriptlanguage="javascript"></script>**script标签可以放在head和body标签里面**<scriptlanguage="javascript">varnow=newDate();varhour=now.getHours();var......
  • AIGC教程:如何使用Stable Diffusion生成风格化游戏物品和图标
    GameLook报道/随着生成型AI的能力提升,越来越多的开发者开始尝试用StableDiffusion提升自己的研发效率。在RPG游戏的制作当中,数量庞大的游戏内物品是非常耗时且费力的部分,装备、道具、药剂等物品可能数以千计,从概念设计到最终放到游戏里的资源,可能耗费很长时间和......
  • 聊聊如何运用JAVA注解处理器(APT)
    什么是APTAPT(AnnotationProcessingTool)它是Java编译期注解处理器,它可以让开发人员在编译期对注解进行处理,通过APT可以获取到注解和被注解对象的相关信息,并根据这些信息在编译期按我们的需求生成java代码模板或者配置文件(比如SPI文件或者spring.fatories)等。APT获取注解及生成代......
  • KindEditor粘贴图片自动上传到服务器(Java版)
    ​图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM.plugins['autoupload'],然后找到autoUploadHandler方法,注释掉其中的代码。加入下面的代码://判断剪贴......
  • Java实现Excel导入和导出,看这一篇就够了(珍藏版)
    前言Java实现表格的相关操作进行了封装,本次封装是基于POI的二次开发,最终使用只需要调用一个工具类中的方法,就能满足业务中绝大部门的导入和导出需求。1.功能测试1.1测试准备在做测试前,我们需要將【2.环境准备】中的四个文件拷贝在工程里(如:我这里均放在了com.zyq.util.exc......
  • Java创建文件时同时需要创建外层多个文件夹
    在Java中,如果您使用File类创建一个新文件,并且指定的路径中包含不存在的文件夹,那么会抛出IOException异常,因为Java不会自动创建缺少的目录结构。要解决这个问题,可以通过以下方法来手动创建缺失的目录:使用File.mkdirs()方法在所需的目录结构下创建文件夹。例如:1Filefile......