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

项目开发中给图片添加水印的操作很常见,比如给图片添加日期和时间,给图片添加公司的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给图片添加水印的更多相关文章

  1. JAVA给图片添加水印

    package com.test; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.*; import jav ...

  2. Java实现图片添加水印

    参考别人的感觉挺好玩,还没仔细研究,先上代码. package WaterMark; import javax.imageio.ImageIO; import java.awt.*; import j ...

  3. java实现给图片添加水印

    package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...

  4. java.imageIo给图片添加水印

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...

  5. Java给图片和PDF文件添加水印(图片水印和文字水印)

    有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...

  6. Java 图片添加水印效果

    package com.xiaowu.drawwater.demo; import java.awt.AlphaComposite; import java.awt.Graphics2D; impor ...

  7. java实现图片和pdf添加铺满文字水印

    依赖jar包 <!-- pdf start --> <dependency> <groupId>com.itextpdf</groupId> <a ...

  8. Java中图片压缩处理

    原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...

  9. java获取图片原始尺寸

    java获取图片原始尺寸 URL url = null; InputStream is = null; BufferedImage img = null; try { url = new URL(pi ...

  10. Android 图片添加水印图片或者文字

    给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

随机推荐

  1. 使用7-zip进行分卷压缩和解分卷压缩(Windows和Linux)

    现在一共有10个视频,一共313M,我对该文件夹进行分卷压缩,每个tar包100M,压缩过程如下: Windows环境首先选中所有的压缩包,然后在压缩包上单击鼠标右键,然后选择7-Zip,再选择提取到 ...

  2. 听说有 Hugging Face 陪伴的春节,是这样的…

    辞旧迎新春节到,家家户户好热闹.Hugging Face 中国团队成员祝各位社区成员们新春快乐,万事如意! 过去的一年我们持续看到 AI 技术的腾飞和发展,以及诸多机构为开源 AI 作出巨大的贡献.非 ...

  3. 【JS】一个思路搞定三道Promise并发编程题,手摸手教你实现一个Promise限制器

    壹 ❀ 引 之前在整理手写Promise相关资料时,在文章推荐区碰巧看到了一道手写Promise并发控制调度器的笔试题(大厂可能爱考),结果今天同事又正好问了我一个关于Promise调度处理的场景问题 ...

  4. JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。

    壹 ❀ 引 今天是六一儿童节,leetcode的每日一题也特别可爱,那么今天我们来解决一道与糖果有关的问题,题目来源1431. 拥有最多糖果的孩子,题目描述如下: 给你一个数组 candies 和一个 ...

  5. JS leetcode 两数之和解答思路分析

    壹 ❀ 引 在学习算法基础的同时,我还是继续捡起leetcode的算法题了,珍惜时间,算法每天进步一点点.不得不说,在了解了一些算法概念后,至少有些答案是能看懂了......(惭愧)虽然我很菜,但是多 ...

  6. Redis缓存相关的几个问题

    1  缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力. ...

  7. Swoole从入门到入土(25)——多进程[进程间无锁计数器]

    Atomic 是 Swoole 底层提供的原子计数操作类,可以方便整数的无锁原子增减.原子计数器有如下特点: - 使用共享内存,可以在不同的进程之间操作计数 - 基于 gcc/clang 提供的 CP ...

  8. Spring rce CVE-2022-22965

    原理大致是这样:spring框架在传参的时候会与对应实体类自动参数绑定,通过"."还可以访问对应实体类的引用类型变量.使用getClass方法,通过反射机制最终获取tomcat的日 ...

  9. [Revit二次开发] 使用过滤器时,可能存在的坑:FilteredElementCollector.MoveNext()报错

    1.问题描述 在使用FilteredElementCollector时,如果涉及到需要对collector进行多次过滤处理,可能会出现MoveNext的报错. 问题代码如下: 1 var collec ...

  10. 【Android 逆向】【攻防世界】easyjava

    1. apk 安装到手机,提示输入flag 2. jadx 打开apk看看 private static char a(String str, b bVar, a aVar) { return aVa ...