首页 > 编程语言 >使用Java给图片添加水印

使用Java给图片添加水印

时间:2024-03-19 11:56:56浏览次数:21  
标签:Java int BufferedImage 水印 原图片 添加 fontSize 图片

  什么是水印呢?比如使用手机拍摄一张照片的时候,照片右下角的位置显示得有日期和时间信息,那就表示一个水印。

 

项目开发中给图片添加水印的操作很常见,比如给图片添加日期和时间,给图片添加公司的logo之类的等等。下面就来聊聊如何使用Java来给图片添加水印。

大致的思路如下

实现方式:读取原图片信息转为 BufferedImage对象;然后利用 BufferedImage 创建 Graphics2D画笔对象,再使用绘图对象中的API进行相应的操作。

实现步骤:

(1)读取原图片数据。

(2)根据原图片数据生成一张新的空白图片

(3)获取新图片的画笔对象

(4)将原图片画在新图片中

(5)使用画笔设置水印内容相关信息如颜色、字体位置等。

(6)保存新生成的图片数据。

 

涉及到的主要类有.

.1.BufferedImage 图片缓冲类

 

.2.Graphics2D 画笔类

常用方法

drawImage() 表示绘制图片

setColor() 设置颜色

setFont() 设置字体

drawString(String str,  int x,  int y) 表示设置绘画内容

参数一: 绘制的"内容";

参数二: 内容在图片中的x坐标,

参数三: 内容在图片中的y坐标

 

dispose() 表示释放资源

 

.4.ImageIO Java操作图片文件的类

 

常用方法

ImageIO.read(File对象)

表示读取图片文件数据

 

ImageIO.write(RenderedImage im, String formatName, OutputStream output);

向输出流中写入图片数据,有三个参数

参数一: 表示缓冲图片对象

参数二: 表示设置格式化名称

 

参考示例代码如下:

    /**

     * 添加水印

     * @param sourceImg 原图片对象

     * @param textColor 文本颜色

     * @param fontSize  字体大小

     * @param text      文本内容

     * @param outPath   图片输出路径

     */

    public static void addTextWaterMark(BufferedImage sourceImg, Color textColor, int fontSize, String text, String outPath) {

        // 获取原图片的宽

        int width = sourceImg.getWidth();

        // 获取原图片的高

        int height = sourceImg.getHeight();

        // 创建一个与原图片大小相同的图片

        BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);

        // 获取图片的画笔对象

        Graphics2D gph = bufferedImage.createGraphics();

        // 将原图片绘制到空白图片上

        gph.drawImage(sourceImg, 0, 0, width, height, null);

        // 设置水印颜色

        gph.setColor(textColor);

        // 设置水印字体

        gph.setFont(new Font("微软雅黑", Font.ITALIC, fontSize));

        // 设置水印内容放置位置

//            int x = width - (text.length() + 1) * fontSize;

//            int y = height- fontSize * 2;

        int x = width - 6 * fontSize;

        int y = height - fontSize / 2;

        // 设置水印内容

        gph.drawString(text, x, y);

 

        try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outPath));) {

            // 保存新生成的图片

            ImageIO.write(bufferedImage, "jpg", bos);

        } catch (Exception ex) {

            ex.printStackTrace();

        } finally {

            // 释放资源

            gph.dispose();

        }

}

说明:操作IO流的时候,能使用带缓冲区的类尽量使用,在一定程度上可以提升文件操作的效率。

然后写一段简单的测试代码如下:

 // 读取图片文件信息

        File file = new File("C:\\Users\\xxx\\Desktop\\temp.png");

        // 将图片文件转换为 BufferedImage 对象

        BufferedImage image = ImageIO.read(file);

        addTextWaterMark(image, Color.RED, 80, "2024-03-14", "C:\\Users\\xxx\\Desktop\\temp.jpg");

        System.out.println("图片处理完成");

在一张图片中的右下角添加一个日期,测试结果如下:

字体的大小,颜色,样式等内容都可以自己根据需要进行调整。

标签:Java,int,BufferedImage,水印,原图片,添加,fontSize,图片
From: https://www.cnblogs.com/yilangcode/p/18082445

相关文章

  • Java-Java基础学习(2)-网络编程-TCP-UDP
    2.网络编程2.1.通信协议TCP、UDP对比TCP打电话连接,稳定三次握手,四次挥手三次握手A:你瞅啥?B:瞅你咋地?A:干一场!四次挥手A:我要走了B:你真的要走了吗?B:你真的真的要走了吗?A:我真的要走了客户端、服务端传输完成,释放连接,效率低UDP发短信不连......
  • JAVA多线程常用方法
    文章目录1.常用方法总结2.run和start3.sleep4.yield5.join6.interrupt6.1相关方法6.2打断park线程6.3过时方法7.守护线程8.线程状态8.1操作系统中8.2Java中1.常用方法总结Thread类的常用API如下:方法说明publicvoidstart()启动一个新线程,Java虚拟......
  • Java中的实用类讲解(上篇)
    如果想观看更多Java内容可上我的个人主页关注我,地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?spm=1000.2115.3001.5343使用工具 IntelliJIDEACommunityEdition2023.1.4使用语言Java8 代码能力快速提升小方法,看完代码自己敲一遍,十分有用目录1.Java......
  • 十大排序算法--Java实现
    冒泡排序(BubbleSort)基本思想:冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。算法步骤:从第一个元素开始,比较相邻的元素。......
  • 【JavaScript编程实操10】1.实现一个函数,要求传递2个参数,返回两个参数的和 2.创建一个
    前言1、实现一个函数,要求传递2个参数,返回两个参数的和代码:实现效果:2、创建一个函数,传递两个参数,返回两个参数的相乘和相加的和代码:实现效果:总结前言    本次继续针对Javascript阶段的函数与对象相关方面的实操练习,共有2个实操,这两个实操具有相似性,只是一个......
  • 工作中Java最常见的6种OOM问题
    前言今天,跟大家一起聊聊线上服务出现OOM问题的6种场景,希望对你会有所帮助。1堆内存OOM堆内存OOM是最常见的OOM了。出现堆内存OOM问题的异常信息如下:java.lang.OutOfMemoryError:Javaheapspace此OOM是由于JVM中heap的最大值,已经不能满足需求了。举个例子:publicclass......
  • 招个Java工程师,却发现了一个宝藏平台
    一直关注磊哥的朋友都知道,磊哥出来创业(做Java就业指导)也快一年了,从最初的纠结彷徨、不知所措,到现在逐渐找到自己的节奏,也算是半个媳妇熬成婆了。磊哥现在每天做的事儿,就是通过文章和视频的方式分享Java干货,并且还能顺便赚点钱,解决自己的温饱问题,这种感觉真是太好了。既能帮......
  • 《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教
    1.简介经过宏哥长时间的查找,终于找到了一个含有iframe的网页。所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的。2.iframe是什么iframe就是我们常用的iframe标签:<iframe>。iframe标签是......
  • JAVA实战开源项目:农村物流配送系统(Vue+SpringBoot)
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1系统登录、注册界面2.2系统功能2.2.1快递信息管理:2.2.2位置信息管理:2.2.3配送人员分配:2.2.4路线规划:2.2.5个人中心:2.2.6退换快递处理:2.2.7客户评价:三、系统展示四、核心代码4.1查询商家4.2退换快递4......
  • JAVA实战开源项目:城市桥梁道路管理系统(Vue+SpringBoot)
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块三、系统展示四、核心代码4.1查询城市桥梁4.2新增城市桥梁4.3编辑城市桥梁4.4删除城市桥梁4.5查询单个城市桥梁五、免责说明一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的城市桥梁道路管理系统,支持管......