Java實現(xiàn)添加文字水印&圖片水印的方法詳解
為什么要給圖片添加水印
為圖片添加水印的主要作用是保護(hù)圖片版權(quán),防止圖片被未經(jīng)授權(quán)的人使用或傳播。
通常情況下,圖片水印會包含圖片作者的名字、版權(quán)信息或公司商標(biāo)等信息,這些信息可以幫助識別圖片的所有者,并對未經(jīng)授權(quán)的使用進(jìn)行追究。
此外,圖片水印還可以用于提醒人們圖片的使用限制,例如是否需要授權(quán)、是否可以用于商業(yè)用途等。
除此之外,圖片水印還可以用于增加圖片的視覺吸引力或宣傳性,例如可以在圖片中添加品牌 logo 或宣傳標(biāo)語等。
總的來說,圖片水印的主要作用是保護(hù)圖片版權(quán)和提醒人們圖片的使用限制,但也可以用于提升圖片的視覺效果和宣傳性。
繪制文字水印
為圖片添加水印是一種常用的圖片處理技術(shù)。在 Java 中可以使用 Graphics2D 類來繪制水印。
以下是一個簡單的例子,展示了如何在圖片的右下角添加一個水?。?/p>
import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class Watermark { public static void main(String[] args) { // 讀取原圖片 BufferedImage image = null; try { image = ImageIO.read(new File("original.jpg")); } catch (IOException e) { e.printStackTrace(); } // 獲取圖片的寬度和高度 int width = image.getWidth(); int height = image.getHeight(); // 創(chuàng)建一個圖片緩存對象 BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 獲取圖片的畫筆 Graphics2D g = newImage.createGraphics(); // 將原圖片繪制到緩存圖片上 g.drawImage(image, 0, 0, width, height, null); // 設(shè)置水印的字體樣式 g.setFont(new Font("微軟雅黑", Font.BOLD, 20)); // 設(shè)置水印的顏色 g.setColor(Color.red); // 設(shè)置水印的位置 g.drawString("Hello World!", width - 120, height - 10); // 釋放圖形上下文使用的系統(tǒng)資源 g.dispose(); // 保存帶水印的圖片 try { ImageIO.write(newImage, "jpg", new File("watermarked.jpg")); } catch (IOException e) { e.printStackTrace(); } } }
動態(tài)計算字符串的寬度
如果你已經(jīng)知道了字符串的大小(size)和內(nèi)容(str),想要計算字符串的寬度,可以使用以下方法:
首先創(chuàng)建一個 Font 對象,使用該對象的 getStringBounds 方法計算字符串的寬度。
import java.awt.Font; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; public class StringWidth { public static void main(String[] args) { // 字符串內(nèi)容 String str = "Hello World!"; // 字體大小 int size = 20; // 創(chuàng)建字體對象 Font font = new Font("微軟雅黑", Font.BOLD, size); // 創(chuàng)建字體渲染上下文 FontRenderContext frc = new FontRenderContext(null, true, true); // 計算字符串的寬度 Rectangle2D bounds = font.getStringBounds(str, frc); // 輸出字符串的寬度 System.out.println(bounds.getWidth()); } }
在這段代碼中,我們首先創(chuàng)建了一個 Font 對象,然后使用該對象的 getStringBounds 方法計算字符串的寬度。
注意,在調(diào)用 getStringBounds 方法時,需要傳入一個 FontRenderContext 對象,該對象用于描述字體的渲染環(huán)境,可以影響字符串的顯示效果。
最后,計算出的字符串寬度是一個 Rectangle2D 對象,你可以使用 getWidth 方法來獲取實際的寬度值。
自適應(yīng)文字水印位置
可以看到,我們添加的水印已經(jīng)超出了圖片的范圍,導(dǎo)致顯示不完全,出現(xiàn)這種結(jié)果的原因是因為我們默認(rèn)字符的寬度為120px
.您可以通過上面介紹的動態(tài)計算字符寬度來讓水印始終顯示在圖片上。
import java.awt.Color; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class Watermark { public static void main(String[] args) { // 讀取原圖片 BufferedImage image = null; try { image = ImageIO.read(new File("original.jpg")); } catch (IOException e) { e.printStackTrace(); } // 獲取圖片的寬度和高度 int width = image.getWidth(); int height = image.getHeight(); // 創(chuàng)建一個圖片緩存對象 BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 獲取圖片的畫筆 Graphics2D g = newImage.createGraphics(); // 字符串內(nèi)容 String str = "Hello World!"; // 字體大小 int size = 20; // 創(chuàng)建字體對象 Font font = new Font("微軟雅黑", Font.BOLD, size); // 創(chuàng)建字體渲染上下文 FontRenderContext frc = new FontRenderContext(null, true, true); // 計算字符串的寬度和高度 Rectangle2D bounds = font.getStringBounds(str, frc); // 字符寬度 int strWidth = (int)bounds.getWidth(); // 字符高度 int strHeight = (int)bounds.getHeight(); // 將原圖片繪制到緩存圖片上 g.drawImage(image, 0, 0, width, height, null); // 設(shè)置水印的字體樣式 g.setFont(font); // 設(shè)置水印的顏色 g.setColor(Color.red); // 設(shè)置水印的位置 g.drawString("Hello World!", width - strWidth - 10, height - strHeight - 10); // 釋放圖形上下文使用的系統(tǒng)資源 g.dispose(); // 保存帶水印的圖片 try { ImageIO.write(newImage, "jpg", new File("watermarked.jpg")); } catch (IOException e) { e.printStackTrace(); } } }
繪制圖片水印
如果你想在 png 格式的圖片上繪制透明的圖片水印,可以使用以下方法:
首先讀取原圖片和水印圖片,然后使用 Graphics2D 類的 drawImage 方法將水印圖片繪制到原圖片上,最后使用 setComposite 方法設(shè)置水印圖片的 alpha 通道值來調(diào)整水印的透明度。
紫色部分為圖片水印。
具體實現(xiàn)如下:
import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class TransparentWatermark { public static void main(String[] args) { // 讀取原圖片 BufferedImage image = null; try { image = ImageIO.read(new File("original.png")); } catch (IOException e) { e.printStackTrace(); } // 獲取圖片的寬度和高度 int width = image.getWidth(); int height = image.getHeight(); // 創(chuàng)建一個圖片緩存對象 BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 獲取圖片的畫筆 Graphics2D g = newImage.createGraphics(); // 將原圖片繪制到緩存圖片上 g.drawImage(image, 0, 0, width, height, null); // 讀取水印圖片 BufferedImage watermark = null; try { watermark = ImageIO.read(new File("watermark.png")); } catch (IOException e) { e.printStackTrace(); } // 獲取水印圖片的寬度和高度 int wmWidth = watermark.getWidth(); int wmHeight = watermark.getHeight(); // 設(shè)置水印圖片的透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f)); // 繪制水印圖片 g.drawImage(watermark, width - wmWidth - 10, height - wmHeight - 10, wmWidth, wmHeight, null); // 釋放圖形上下文使用的系統(tǒng)資源 g.dispose(); // 保存帶水印的圖片 try { ImageIO.write(newImage, "png", new File("watermarked.png")); } catch (IOException e) { e.printStackTrace(); } } }
提升圖片處理速度
目前我們添加文字水印和圖片水印耗時都在 700ms - 2000ms
。
可以考慮以下幾種方法來提升速度:
- 使用多線程:如果你需要批量添加文字水印,可以考慮使用多線程的方式來加速處理速度。例如,你可以將圖片分成多份,每份使用一個線程處理,最后再將結(jié)果合并。
- 使用更快的圖片處理庫:如果你使用的是 Java 原生的圖片處理工具(例如 java.awt 包),可以考慮使用更快的圖片處理庫,例如 OpenCV、Imaging、Thumbnails 等。這些庫通常具有更快的處理速度,并且支持更多的圖片格式和操作。
- 減少圖片的質(zhì)量:如果你的圖片尺寸較大,可以考慮將圖片的質(zhì)量壓縮到一個較低的水平,這樣可以減少圖片的體積,從而加快處理速度。
- 優(yōu)化代碼:如果你的代碼有一些低效的地方,可以考慮優(yōu)化代碼,提升程序的執(zhí)行效率。例如,可以避免使用過多的循環(huán)和分支語句,或者使用更快的算法等。
到此這篇關(guān)于Java實現(xiàn)添加文字水印&圖片水印的方法詳解的文章就介紹到這了,更多相關(guān)Java添加水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java調(diào)用微信客服消息實現(xiàn)發(fā)貨通知的方法詳解
這篇文章主要介紹了Java調(diào)用微信客服消息實現(xiàn)發(fā)貨通知的方法,結(jié)合實例形式詳細(xì)分析了java針對微信接口調(diào)用的原理、調(diào)用方法與相關(guān)注意事項,需要的朋友可以參考下2017-08-08使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式
這篇文章主要介紹了使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09實例講解Java的MyBatis框架對MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢
這里我們來以實例講解Java的MyBatis框架對MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢,包括一對多、多對一的關(guān)聯(lián)查詢以及自身關(guān)聯(lián)映射的方法等,需要的朋友可以參考下2016-06-06springboot?serviceImpl初始化注入對象實現(xiàn)方式
這篇文章主要介紹了springboot?serviceImpl初始化注入對象實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05