Java為圖片添加水印并保存實現(xiàn)方法(附帶源碼)
項目背景
在圖像處理領域,水印是一種常見的保護版權和標識圖片歸屬的方法。水印可以是文字、水印圖片或透明圖層,它通常位于圖片的中央或角落。在很多應用中,例如圖片共享、相冊管理等,我們可能需要在圖像上添加水印。
Java提供了強大的圖像處理能力,可以通過Graphics2D類在圖像上繪制水印。本項目的目標是實現(xiàn)一個Java程序,能夠將文字或圖片水印添加到圖像上,并將修改后的圖像保存為文件。
相關知識
BufferedImage
BufferedImage是Java中用來表示圖像的類,它允許對圖像進行像素級別的操作。圖像可以通過Graphics2D進行繪制、縮放、添加水印等。
Graphics2D
Graphics2D是Graphics的一個子類,用于圖形繪制。通過Graphics2D,我們可以在圖像上繪制各種元素,如文本、圖片、形狀等,并控制繪制的透明度、顏色、字體等屬性。
ImageIO
ImageIO類用于從文件讀取圖像,或將圖像保存為指定格式的文件(如PNG、JPEG等)。
實現(xiàn)思路
- 加載圖像:使用
ImageIO.read()從文件中加載圖像。 - 添加水印:
- 文字水印:通過
Graphics2D的drawString()方法在圖像上繪制文本。 - 圖片水印:通過
Graphics2D的drawImage()方法將另一張圖片作為水印繪制到目標圖像上。
- 文字水印:通過
- 保存圖像:使用
ImageIO.write()將修改后的圖像保存為文件。
實現(xiàn)代碼
以下是一個實現(xiàn)為圖片添加文字水印和圖片水印的Java程序:
1. Java代碼:添加水印并保存圖像
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageWatermark {
public static void main(String[] args) {
try {
// 1. 加載圖像
File inputFile = new File("path/to/your/image.jpg"); // 修改為你的圖片路徑
BufferedImage image = ImageIO.read(inputFile);
// 2. 添加文字水印
String textWatermark = "Sample Watermark";
BufferedImage textWatermarkedImage = addTextWatermark(image, textWatermark);
// 3. 添加圖片水印
File watermarkImageFile = new File("path/to/your/watermark_image.png"); // 修改為水印圖片路徑
BufferedImage watermarkImage = ImageIO.read(watermarkImageFile);
BufferedImage finalImage = addImageWatermark(textWatermarkedImage, watermarkImage);
// 4. 保存添加水印后的圖像
File outputFile = new File("path/to/save/watermarked_image.png"); // 輸出文件路徑
ImageIO.write(finalImage, "PNG", outputFile); // 保存為PNG格式
System.out.println("Watermark added and image saved successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
// 添加文字水印
private static BufferedImage addTextWatermark(BufferedImage originalImage, String watermarkText) {
Graphics2D g2d = (Graphics2D) originalImage.getGraphics();
// Set font and transparency
Font font = new Font("Arial", Font.BOLD, 50);
g2d.setFont(font);
g2d.setColor(new Color(255, 255, 255, 128)); // 白色且半透明
// Get the watermark's position (center the watermark on the image)
FontMetrics fontMetrics = g2d.getFontMetrics();
int x = (originalImage.getWidth() - fontMetrics.stringWidth(watermarkText)) / 2;
int y = originalImage.getHeight() / 2;
// Draw watermark text
g2d.drawString(watermarkText, x, y);
// Dispose the graphics context
g2d.dispose();
return originalImage;
}
// 添加圖片水印
private static BufferedImage addImageWatermark(BufferedImage originalImage, BufferedImage watermarkImage) {
Graphics2D g2d = (Graphics2D) originalImage.getGraphics();
// Get the watermark image's position (bottom-right corner)
int x = originalImage.getWidth() - watermarkImage.getWidth() - 10; // 10px margin from the right edge
int y = originalImage.getHeight() - watermarkImage.getHeight() - 10; // 10px margin from the bottom edge
// Draw watermark image with transparency
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); // Set transparency
g2d.drawImage(watermarkImage, x, y, null);
// Dispose the graphics context
g2d.dispose();
return originalImage;
}
}
代碼解讀
加載圖像:
- 使用
ImageIO.read(inputFile)讀取指定路徑的圖像文件并將其存儲在BufferedImage對象中。
- 使用
添加文字水印:
- 使用
Graphics2D對象的drawString()方法在圖像上繪制文字水印。我們設置了字體、顏色(白色且?guī)в型该鞫龋┮约拔恢茫ň又校?/li> g2d.setColor(new Color(255, 255, 255, 128))設置文字的顏色為白色,并帶有128的透明度。
- 使用
添加圖片水印:
- 使用
Graphics2D對象的drawImage()方法將另一個圖像作為水印繪制到目標圖像的右下角。 - 通過
AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)設置透明度,使水印圖片具有50%的透明度。
- 使用
保存圖像:
- 使用
ImageIO.write()方法將添加水印后的圖像保存為PNG格式。
- 使用
資源管理:
g2d.dispose()釋放Graphics2D對象占用的資源,防止內(nèi)存泄漏。
常見的水印操作
文字水印:
- 可以調(diào)整字體、顏色、大小、透明度等屬性來控制水印的外觀。字體可以使用
Font類設置,顏色使用Color類設置。 - 文字水印的位置可以通過計算圖像的寬度和文字的寬度來確定,使其居中或位于指定位置。
- 可以調(diào)整字體、顏色、大小、透明度等屬性來控制水印的外觀。字體可以使用
圖片水印:
- 使用
drawImage()方法繪制另一張圖像作為水印??梢哉{(diào)整水印的位置、大小、透明度等。 - 水印圖片的透明度通過
AlphaComposite類設置。
- 使用
透明度控制:
- 對于圖片水印,透明度的控制是非常重要的。通過設置
AlphaComposite的值,可以讓水印圖片更加隱約,從而不遮蓋原圖的細節(jié)。
- 對于圖片水印,透明度的控制是非常重要的。通過設置
水印位置:
- 文字水印的位置可以選擇居中或定位置。圖片水印常見位置有右下角、左下角、右上角等。通過坐標計算可以實現(xiàn)靈活定位。
項目總結
通過本項目,我們實現(xiàn)了一個簡單的Java程序,能夠在圖像上添加文字水印和圖片水印。使用Graphics2D類,我們可以靈活地控制水印的外觀,包括位置、透明度、顏色等,并通過ImageIO.write()保存修改后的圖像。
優(yōu)化方向:
- 自定義水印樣式:可以為文字水印提供更多的自定義選項,比如字體、大小、顏色、透明度等。
- 批量水印添加:可以擴展程序,支持批量處理多個圖像文件,并添加統(tǒng)一的水印。
- 圖形界面:可以為程序添加圖形界面,允許用戶通過界面選擇水印類型(文字或圖片)、位置、透明度等參數(shù)。
通過這個項目,您可以掌握如何使用Java進行圖像水印的處理,適用于版權保護、品牌宣傳、圖片批量處理等場景。
到此這篇關于Java為圖片添加水印并保存實現(xiàn)方法的文章就介紹到這了,更多相關Java為圖片添加水印并保存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mybatis?mapper.xml中如何根據(jù)數(shù)據(jù)庫類型選擇對應SQL語句
這篇文章主要介紹了mybatis?mapper.xml中如何根據(jù)數(shù)據(jù)庫類型選擇對應SQL語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
從0開始學習大數(shù)據(jù)之java spark編程入門與項目實踐
這篇文章主要介紹了從0開始學習大數(shù)據(jù)之java spark編程入門與項目實踐,結合具體入門項目分析了大數(shù)據(jù)java spark編程項目建立、調(diào)試、輸出等相關步驟及操作技巧,需要的朋友可以參考下2019-11-11
Java concurrency之公平鎖(一)_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Java concurrency之公平鎖的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Spring中使用騰訊云發(fā)送短信驗證碼的實現(xiàn)示例
本文主要介紹了Spring?中?使用騰訊云發(fā)送短信驗證碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

