Java實(shí)現(xiàn)在圖片中添加文字水印的示例代碼
本文介紹了一個(gè)使用Java實(shí)現(xiàn)的圖片水印工具,該工具能夠讀取指定路徑的圖片,在圖片上添加文字水印,并將帶有水印的圖片保存到指定路徑。文章詳細(xì)展示了如何使用Java AWT庫(kù)進(jìn)行圖片處理,包括設(shè)置水印的顏色、字體、位置等。
完整代碼如下:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* @Author: 浮云
* @Date: 2019/12/21 21:51
*/
public class MarkImageUtils {
public static void main(String[] args) {
Color color=new Color(255, 45, 160);
Font font = new Font("微軟雅黑", Font.BOLD, 30);
waterMark("D:/Temp/test.jpg", "D:/Temp//test1.png","好冷~嗚嗚嗚~~~",color,font,130,50);
}
/**
* @param filePath 原圖片
* @param outFile 輸出圖片
* @param text 水印文字
* @param color 顏色
* @param font 字體
* @param x 水印起始X坐標(biāo)
* @param y 水印起始Y坐標(biāo)
* @return 添加水印是否成功 true-成功 false-失敗
*/
public static boolean waterMark(String filePath, String outFile,
String text, Color color, Font font, int x, int y) {
String result = "打水印失??!";
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
BufferedImage im = ImageIO.read(fis);//讀取原圖片
int width = im.getWidth();//原圖片寬
int height = im.getHeight();//原圖片高
//判斷水印起始x和y坐標(biāo)是否小于原圖片寬和高
if (x > width || y > height) {
System.out.println(result);
return false;
}
Graphics g = im.getGraphics();//創(chuàng)建畫板
g.setColor(color);//設(shè)置顏色
g.setFont(font);//設(shè)置文字樣式
g.drawString(text, x, y);//向畫板上寫字
g.dispose();//釋放資源
ImageIO.write(im, "jpg", new File(outFile));
} catch (IOException e) {
System.out.println(result);
return false;
} finally {
closeFileInputStream(fis);
}
result = "打水印成功!";
System.out.println(result);
return true;
}
/**
* 關(guān)閉文件輸入流
* @param fis
*/
public static void closeFileInputStream (FileInputStream fis){
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如果不知道有哪些字體,可以用以下代碼打印所有字體
import java.awt.*;
/**
* @Author: 浮云
* @Date: 2019/12/22 0:23
*/
public class FontDemo {
public static void main(String[] args) {
Font[] fonts = GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getAllFonts();
for (Font font : fonts) {
System.out.println(font.getFontName());
}
}
}
知識(shí)補(bǔ)充:
在 Java 中為圖片添加文字水印是非常常見的需求,通常使用 java.awt 包下的 Graphics2D 類就能輕松實(shí)現(xiàn)。下面我會(huì)提供一個(gè)簡(jiǎn)潔但功能完整的方法,支持設(shè)置水印文本、字體、顏色、透明度、位置以及旋轉(zhuǎn)角度。
基礎(chǔ)實(shí)現(xiàn):添加單個(gè)文字水印
以下代碼可以在圖片的指定位置添加一個(gè)半透明文字水印。
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageWatermark {
/**
* 為圖片添加文字水印
*
* @param srcImageFile 源圖片文件路徑
* @param destImageFile 目標(biāo)圖片文件路徑
* @param watermarkText 水印文字
* @param x 水印左上角 X 坐標(biāo)(相對(duì)原圖)
* @param y 水印左上角 Y 坐標(biāo)
* @param fontSize 字體大小(像素)
* @param alpha 透明度 (0.0 ~ 1.0)
* @param angle 旋轉(zhuǎn)弧度(0 表示不旋轉(zhuǎn))
*/
public static void addTextWatermark(String srcImageFile, String destImageFile,
String watermarkText, int x, int y,
int fontSize, float alpha, double angle) throws IOException {
// 1. 讀取原圖
BufferedImage image = ImageIO.read(new File(srcImageFile));
int width = image.getWidth();
int height = image.getHeight();
// 2. 創(chuàng)建 Graphics2D 對(duì)象
Graphics2D g2d = image.createGraphics();
// 開啟抗鋸齒,讓文字邊緣更平滑
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// 3. 設(shè)置字體和顏色
Font font = new Font("宋體", Font.BOLD, fontSize);
g2d.setFont(font);
g2d.setColor(Color.WHITE); // 文字顏色
// 4. 設(shè)置透明度(AlphaComposite)
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2d.setComposite(alphaComposite);
// 5. 旋轉(zhuǎn)文字(如果需要)
if (angle != 0) {
g2d.rotate(angle, x + (fontSize * watermarkText.length()) / 4.0, y + fontSize / 2.0);
}
// 6. 繪制水印文字
g2d.drawString(watermarkText, x, y);
// 7. 釋放資源
g2d.dispose();
// 8. 保存新圖片
String format = destImageFile.substring(destImageFile.lastIndexOf(".") + 1);
ImageIO.write(image, format, new File(destImageFile));
}
public static void main(String[] args) {
try {
addTextWatermark("input.jpg", "output.jpg",
"? 2026 MyCompany", 50, 100,
36, 0.5f, 0);
System.out.println("水印添加成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}高級(jí)用法:自動(dòng)定位(右下角、居中、平鋪)
1. 水印位于右下角,自動(dòng)偏移
int margin = 20; FontMetrics metrics = g2d.getFontMetrics(font); int textWidth = metrics.stringWidth(watermarkText); int textHeight = metrics.getHeight(); int x = width - textWidth - margin; int y = height - margin;
2. 水印平鋪整個(gè)圖片(防截圖)
可以利用循環(huán)繪制多個(gè)水印,常見于版權(quán)保護(hù)。
int stepX = 200;
int stepY = 150;
for (int i = 0; i < width; i += stepX) {
for (int j = 0; j < height; j += stepY) {
g2d.drawString(watermarkText, i, j);
}
}3. 水印居中并旋轉(zhuǎn)一定角度
// 獲取文字寬高 FontMetrics fm = g2d.getFontMetrics(); int textWidth = fm.stringWidth(watermarkText); int textHeight = fm.getHeight(); // 中心點(diǎn)坐標(biāo) int centerX = width / 2 - textWidth / 2; int centerY = height / 2 + textHeight / 4; // 視覺居中 // 旋轉(zhuǎn) 30 度(弧度制) double angle = Math.toRadians(30); g2d.rotate(angle, width / 2.0, height / 2.0); g2d.drawString(watermarkText, centerX, centerY);
常見問題與注意事項(xiàng)
| 問題 | 解決方案 |
|---|---|
| 中文亂碼 | 確保使用的字體支持中文(如 "宋體"、"Microsoft YaHei"、"SimHei"),不要用 "Arial"。 |
| 文字鋸齒 | 開啟抗鋸齒提示:g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); |
| 透明背景圖片(PNG) | 水印會(huì)正常疊加,無(wú)需特殊處理;如果希望水印也帶半透明,調(diào)整 alpha 值即可。 |
| 保存格式限制 | 某些格式(如 GIF)不支持高精度顏色,建議保存為 PNG 或 JPG。 |
| 性能優(yōu)化 | 若對(duì)大量圖片添加相同水印,可提前預(yù)計(jì)算字體和透明度,避免在循環(huán)中重復(fù)創(chuàng)建 Font 對(duì)象。 |
擴(kuò)展:水印工具類封裝(支持更多參數(shù))
public class WatermarkUtil {
/**
* 添加文字水印
* @param src 源圖片路徑
* @param dest 目標(biāo)路徑
* @param text 水印文字
* @param config 配置項(xiàng)(位置、字體、顏色、透明度等)
*/
public static void watermark(String src, String dest, String text, WatermarkConfig config) throws IOException {
// ... 具體實(shí)現(xiàn)
}
public static class WatermarkConfig {
private int x = -1; // 負(fù)值表示自動(dòng)計(jì)算
private int y = -1;
private String fontName = "宋體";
private int fontSize = 36;
private Color color = Color.WHITE;
private float alpha = 0.6f;
private double angle = 0;
private boolean tile = false; // 是否平鋪
private int tileStepX = 200;
private int tileStepY = 150;
// ... getter / setter
}
}總結(jié)
- 核心步驟:
ImageIO.read→Graphics2D→ 設(shè)置透明度和字體 →drawString→ImageIO.write - 關(guān)鍵技巧:使用
AlphaComposite實(shí)現(xiàn)半透明效果;利用FontMetrics精確計(jì)算文字尺寸;開啟抗鋸齒提升顯示質(zhì)量。 - 適用場(chǎng)景:圖片版權(quán)保護(hù)、分享標(biāo)記、上傳預(yù)覽圖標(biāo)識(shí)等。
到此這篇關(guān)于Java實(shí)現(xiàn)在圖片中添加文字水印的示例代碼的文章就介紹到這了,更多相關(guān)Java圖片添加文字水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis的動(dòng)態(tài)SQL以及連接池詳解
這篇文章主要介紹了mybatis的動(dòng)態(tài)SQL以及連接池詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java聊天室之實(shí)現(xiàn)運(yùn)行服務(wù)器與等待客戶端連接
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之實(shí)現(xiàn)運(yùn)行服務(wù)器程序與等待客戶端程序連接功能,文中的示例代碼講解詳細(xì),需要的可以了解一下2022-10-10
IDEA項(xiàng)目使用SpringBoot+MyBatis-Plus的方法
這篇文章主要介紹了IDEA項(xiàng)目使用SpringBoot+MyBatis-Plus的方法,本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Spring+SpringMVC+MyBatis深入學(xué)習(xí)及搭建(二)之MyBatis原始Dao開發(fā)和mapper代理開發(fā)
這篇文章主要介紹了Spring+SpringMVC+MyBatis深入學(xué)習(xí)及搭建(二)之MyBatis原始Dao開發(fā)和mapper代理開發(fā),需要的朋友可以參考下2017-05-05
Spring中過(guò)濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系解析
在我們?nèi)粘5拈_發(fā)中,我們經(jīng)常會(huì)用到Filter和Interceptor,這篇文章主要介紹了Spring中過(guò)濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系?,需要的朋友可以參考下2022-10-10
java提取字符串中數(shù)字string以及獲取字符串中的整數(shù)或小數(shù)
這篇文章主要給大家介紹了關(guān)于java提取字符串中數(shù)字string以及獲取字符串中的整數(shù)或小數(shù)的相關(guān)資料,需要的朋友可以參考下2023-08-08
一篇超詳細(xì)的SpringBoot整合MybatisPlus的文章
這篇文章主要介紹了springboot整合Mybatis-plus的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07

