JAVA實現圖片水印

2020-12-24 淚流雲

一、JAVA圖片水印實現原理

1.1、JAVA圖片水印實現思路

1、創建緩存圖片對象。

2、創建Java繪圖工具對象。

3、使用繪圖工具對象將原圖繪製到緩存圖片對象。

4、使用繪圖工具將水印(文字/圖片)繪製到緩存圖片對象。

5、創建圖像編碼工具類。

6、使用圖像編碼工具類,輸出緩存圖像到目標圖片文件。

1.2、JAVA圖片水印使用工具類

1、BufferedImage 把對象儲存到緩存中,提高運行效率。

2、Graohics2D 對對象進行操作。

3、JPEGImageEncode 對對象進行編碼,把內存中的對象刻錄到我們的磁碟上。

二、實現圖片添加單個文字水印

/*

* 給圖片添加單個文字水印類

* */

publicclassTextWatermarking {

//定義圖片水印字體類型

publicstaticfinalString FONT_NAME = "微軟雅黑";

//定義圖片水印字體加粗、變細、傾斜等樣式

publicstaticfinalintFONT_STYLE= Font.BOLD;

//設置字體大小

publicstaticfinalintFONT_SIZE= 120;

//設置文字透明程度

publicstaticfloatALPHA= 0.3F;

publicstaticfinalintX=10;

publicstaticfinalintY=10;

/**

* 給圖片添加單個文字水印、可設置水印文字旋轉角度

* source 需要添加水印的圖片路徑(如:F:/images/6.jpg

* outPut 添加水印後圖片輸出路徑(如:F:/images/)

* imageName 圖片名稱

* imageType 圖片類型

* color 水印文字的顏色

* word 水印文字

* degree 水印文字旋轉角度,為null表示不旋轉

*/

publicBoolean markImageBySingleText(String sourcePath, String outputPath, String imageName, String imageType, Color color, String word, Integer degree) {

try{

//讀取原圖片信息

File file = new File(sourcePath);

if(!file.isFile()) {

returnfalse;

}

//獲取源圖像的寬度、高度

Image image = ImageIO.read(file);

intwidth = image.getWidth(null);

intheight = image.getHeight(null);

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

//創建繪圖工具對象

Graphics2D graphics2D = bufferedImage.createGraphics();

//其中的0代表和原圖位置一樣

graphics2D.drawImage(image, 0, 0, width, height, null);

//設置水印文字(設置水印字體樣式、粗細、大小)

graphics2D.setFont(new Font(FONT_NAME, FONT_STYLE, FONT_SIZE));

//設置水印顏色

graphics2D.setColor(color);

//設置水印透明度

graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));

//設置水印旋轉

if(null != degree) {

graphics2D.rotate(Math.toRadians(degree),(double) bufferedImage.getWidth() / 2, (double) bufferedImage.getHeight() / 2);

}

intwidth1=FONT_SIZE*getTextLength(word);

intheight1=FONT_SIZE;

intwidthDiff=width-width1;

intheightDiff=height-height1;

intx=X;

inty=Y;

if(x>widthDiff)

{

x=widthDiff;

}

if(y>heightDiff)

{

y=heightDiff;

}

//進行繪製

graphics2D.drawString(word, x, y+120);

graphics2D.dispose();

//輸出圖片

File sf = new File(outputPath, imageName+"."+imageType);

// 保存圖片

ImageIO.write(bufferedImage, imageType, sf);

} catch (Exception e) {

e.printStackTrace();

}

returntrue;

}

/**

* 如果水印內容超出判斷

*/

publicintgetTextLength(String text)

{

intlength=text.length();

for(int i = 0; i < text.length(); i++) {

String s=String.valueOf(text.charAt(i));

if(s.getBytes().length>1)

{

length++;

}

}

length=length%2==0?length/2:length/2+1;

returnlength;

}

}

三、實現圖片添加單個圖片水印

/*

* 給圖片添加單個圖片水印、可設置水印圖片旋轉角度

* */

publicclassImageWatermark {

publicstaticfinalintX=10;

publicstaticfinalintY=10;

/**

*icon 水印圖片路徑(如:F:/images/icon.png)

*source 沒有加水印的圖片路徑(如:F:/images/6.jpg

*output 加水印後的圖片路徑(如:F:/images/)

*imageName 圖片名稱(如:11111)

*imageType 圖片類型(如:jpg

*degree 水印圖片旋轉角度,為null表示不旋轉

*/

publicBoolean markImageBySingleIcon(String icon,String source,String output,String imageName,String imageType,Integer degree) {

try{

File file = new File(source);

File ficon = new File(icon);

if(!file.isFile()) {

returnfalse;

}

//將icon加載到內存中

Image ic = ImageIO.read(ficon);

//icon高度

inticheight= ic.getHeight(null);

//將源圖片讀到內存中

Image img = ImageIO.read(file);

//圖片寬

intwidth = img.getWidth(null);

//圖片高

intheight = img.getHeight(null);

BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//創建一個指定 BufferedImage 的 Graphics2D 對象

Graphics2D g = bi.createGraphics();

//設置對線段的鋸齒狀邊緣處理

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);

//呈現一個圖像,在繪製前進行從圖像空間到用戶空間的轉換

g.drawImage(img.getScaledInstance(width,height,Image.SCALE_SMOOTH),0,0,null);

if(null != degree) {

//設置水印旋轉

g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2);

}

//水印圖象的路徑 水印一般為gif或者png的,這樣可設置透明度

ImageIcon imgIcon = new ImageIcon(icon);

//得到Image對象。

Image con = imgIcon.getImage();

intwidth1=con.getWidth(null);

intheight1=con.getHeight(null);

intwidthDiff=width-width1;

intheightDiff=height-height1;

intx=X;

inty=Y;

if(x>widthDiff)

{

x=widthDiff;

}

if(y>heightDiff)

{

y=heightDiff;

}

//透明度,最小值為0,最大值為1

floatclarity = 0.6f;

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,clarity));

//表示水印圖片的坐標位置(x,y)

g.drawImage(con, x, y, null);

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

g.dispose();

File sf = new File(output, imageName+"."+imageType);

ImageIO.write(bi, imageType, sf); // 保存圖片

} catch (Exception e) {

e.printStackTrace();

}

returntrue;

}

四、實現圖片添加多個文字水印

/*

* 給圖片添加多個文字水印類

* */

publicclassTextWatermarking {

// 定義圖片水印字體類型

publicstaticfinalString FONT_NAME = "微軟雅黑";

// 定義圖片水印字體加粗、變細、傾斜等樣式

publicstaticfinalintFONT_STYLE= Font.BOLD;

// 設置字體大小

publicstaticfinalintFONT_SIZE= 120;

// 設置文字透明程度

publicstaticfloatALPHA= 0.3F;

/**

* 給圖片添加多個文字水印、可設置水印文字旋轉角度 source 需要添加水印的圖片路徑 outPut 添加水印後圖片輸出路徑 imageName 圖片名稱

* imageType 圖片類型 color 水印文字的顏色 word 水印文字 degree 水印文字旋轉角度,為null表示不旋轉

*/

publicBoolean markImageByMoreText(String sourcePath, String outputPath, String imageName, String imageType,

Color color, String word, Integer degree) {

try{

// 讀取原圖片信息

File file = newFile(sourcePath);

if(!file.isFile()) {

returnfalse;

}

// 獲取源圖像的寬度、高度

Image image = ImageIO.read(file);

intwidth = image.getWidth(null);

intheight = image.getHeight(null);

BufferedImage bufferedImage = newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 創建繪圖工具對象

Graphics2D graphics2D = bufferedImage.createGraphics();

// 其中的0代表和原圖位置一樣

graphics2D.drawImage(image, 0, 0, width, height, null);

// 設置水印文字(設置水印字體樣式、粗細、大小)

graphics2D.setFont(newFont(FONT_NAME, FONT_STYLE, FONT_SIZE));

// 設置水印顏色

graphics2D.setColor(color);

// 設置水印透明度

graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));

// 設置水印旋轉

if(null != degree) {

graphics2D.rotate(Math.toRadians(degree), (double) bufferedImage.getWidth() / 2,

(double) bufferedImage.getHeight() / 2);

}

intwidth1 = FONT_SIZE * getTextLength(word);

intheight1 = FONT_SIZE;

intx = -width / 2;

inty = -height / 2;

while(x < width * 1.5) {

y = -height / 2;

while(y < height * 1.5) {

graphics2D.drawString(word, x, y);

y += height1 + 300;

}

x += width1 + 300;

}

graphics2D.dispose();

// 輸出圖片

File sf = newFile(outputPath, imageName + "." + imageType);

// 保存圖片

ImageIO.write(bufferedImage, imageType, sf);

} catch(Exception e) {

e.printStackTrace();

}

returntrue;

}

/**

* 如果水印內容超出判斷

*/

publicintgetTextLength(String text) {

intlength = text.length();

for(int i = 0; i < text.length(); i++) {

String s = String.valueOf(text.charAt(i));

if(s.getBytes().length > 1) {

length++;

}

}

length = length % 2 == 0 ? length / 2 : length / 2 + 1;

returnlength;

}

}

五、JAVA實現添加多個圖片水印

publicclassMoreImageWatermark {

// 設置文字透明程度

publicstaticfloatALPHA= 0.3F;

/**

* 給圖片添加多個圖片水印、可設置水印圖片旋轉角度 logoPath 水印圖片的路徑 source 需要添加水印的圖片路徑 outPut

* 添加水印後圖片輸出路徑 imageName 圖片名稱 imageType 圖片類型 degree 水印文字旋轉角度,為null表示不旋轉

*/

publicBoolean markImageByMoreImage(String logoPath, String sourcePath, String outputPath, String imageName,

String imageType, Integer degree) {

try{

// 讀取原圖片信息

File file = newFile(sourcePath);

if(!file.isFile()) {

returnfalse;

}

// 獲取源圖像的寬度、高度

Image image = ImageIO.read(file);

intwidth = image.getWidth(null);

intheight = image.getHeight(null);

BufferedImage bufferedImage = newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 創建繪圖工具對象

Graphics2D graphics2D = bufferedImage.createGraphics();

// 其中的0代表和原圖位置一樣

graphics2D.drawImage(image, 0, 0, width, height, null);

// 設置水印透明度

graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));

// 設置水印旋轉

if(null != degree) {

graphics2D.rotate(Math.toRadians(degree), (double) bufferedImage.getWidth() / 2,

(double) bufferedImage.getHeight() / 2);

}

File logo = newFile(logoPath);

Image logoimage = ImageIO.read(logo);

intwidth1 = logoimage.getWidth(null);

intheight1 = logoimage.getHeight(null);

intx = -width / 2;

inty = -height / 2;

while(x < width * 1.5) {

y = -height / 2;

while(y < height * 1.5) {

graphics2D.drawImage(logoimage, x, y, null);

y += height1 + 300;

}

x += width1 + 300;

}

graphics2D.dispose();

// 輸出圖片

File sf = newFile(outputPath, imageName + "." + imageType);

// 保存圖片

ImageIO.write(bufferedImage, imageType, sf);

} catch(Exception e) {

e.printStackTrace();

}

returntrue;

}

}

相關焦點

  • 圖片上添加文字水印應該怎樣實現,如何給圖片添加水印
    現在的人都很注重版權,無論是在網上發表自己的文章,還是自己親手拍的照片,自己製作的圖片,或者畫出來一個好的創意,想要分享給到網上分享的時候,都會想著給這些圖片加上一個屬於自己的權限標誌,那麼,如何在圖片上批量添加文字呢?其實現在給圖片加水印是一件極其簡單的事情,不止PS,還有很多電腦軟體能幫我們實現。
  • 如何給一張照片添加圖片水印
    昨天在高中的班級群裡有同學這樣問道:有沒有可以給照片添加圖片格式水印的方法?群裡很快就炸開了,有女生建議可以用某修圖軟體實現。當然這不失為一個好辦法,但這只是移動端的解決措施,那麼在PC端呢?還是有辦法的!具體如何實現呢,我們一起來揭曉吧:如何給一張照片添加圖片水印。
  • 如何去掉圖片水印,快速批量清除圖片水印,圖片上的水印怎麼去掉
    現在很多人都在使用小紅書app,但大家肯定都會有同一個問題,圖片怎麼保存,重點是怎麼保存圖片無水印。看到好看的圖片想保存下來,可是卻不喜歡看到有水印。今天,就好好和大家分享一下小紅書保存圖片途徑,往下看不會讓你失望。
  • 如何給圖片添加水印,美圖秀秀如何批量給圖片添加水印一起來看看
    在日常生活中,我們為了防止圖片被盜用,經常需要給圖片添加水印,一個一個添加肯定太麻煩,那麼如何批量給圖片添加水印那,今天我們就來學習一下。我們給圖片批量添加水印用到的是美圖秀秀這個軟體,我們百度搜索美圖秀秀然後安裝就可以了。安裝好之後如下圖,我們點擊批處理功能按鈕。點擊批處理之後就會出現下面的頁面,左邊的是添加多張圖片,選擇我們處理的多張圖片,因為我們是給圖片添加水印,選擇右邊我們提前製作好的水印圖片就OK了。
  • 如何同時給多張圖片添加二維碼水印?
    每個二維碼裡都包含著重要信息,所以用於作為識別水印也是比較有效的一種方式,將二維碼作為水印放到圖片上,也能達到一定的推廣效果。圖片上添加水印本身就是一件很簡單的事情,只需要藉助一些工具就能輕鬆實現,今天這裡就分享一個適合新手的方法,一個可以批量給圖片添加二維碼水印的方法。操作簡單好記,請往下看看吧!
  • 【圖片文字水印】圖片文字水印安卓版(Android)3.2下載_太平洋下載...
    圖片文字水印 生活工具 大小: 12.91M
  • 什麼手機App可以給圖片或證件照加水印?大家為什麼給圖片加水印
    在介紹之前,我們先來說說為什麼給證件照、圖片加水印?因為證件資料照片裡有我們重要的個人信息,添加水印能標明用途,預防信息洩露,被他人另作他用,那麼下面我們就來分享三種能給圖片加水印的App。1.簡易水印這款App的主要特點是:8M大小、簡約而不簡單,主要是免費的。
  • 不會PS 四大「魔法」幫您輕鬆去除圖片水印
    各位老師在製作微課或者PPT時,難免會去網上下載一些圖片,但是很多圖片帶有的水印很讓人頭疼,這應該怎麼辦呢?還在看PS去水印教程的老師可以先暫停視頻等一下下,看一下今天這篇文章介紹的可以快捷去水印的小竅門,90%的去水印問題都可以解決哦。快來往下看看是哪幾招吧!
  • 給你的身份證圖片添加水印的方法
    現在網絡上使用身份證照片的地方越來越多,如果身份證照片不經處理隨意發送,有可能會產生潛在的風險,這裡教你如何給身份證照片添加水印,以防被不發份子利用。首先,用美圖秀秀打開你的身份證照片。提示你是否縮小到最佳尺寸時,選擇否。
  • 美觀又防盜 美圖秀秀給圖片輕鬆加水印
    但是網絡上盜圖竊文肆無忌憚,哪天自己的照片、圖片被陌生人拿去隨意用怎麼辦?別急,快來看看小編用圖片處理軟體美圖秀秀打造的個性水印,防盜+美化,兩不耽誤哦!  先來看看下面的效果:▲水印處理效果  給圖片加專屬個性水印,不但防盜還能起到美化點綴的作用,不錯吧? 趕快來學習一下吧!  1、在「美圖秀秀」 軟體下,點擊「新建」按鈕新建一個透明畫布,然後點擊「應用」按鈕。
  • Java實現冒泡排序算法
    2.你能用java實現冒泡排序嗎?3.你能寫出更優秀的冒泡排序代碼嗎?3.案例3.1.冒泡排序思想假設有一個待排序序列:[4, 5, 6, 3, 2, 1]。實現了一個冒泡排序。在這裡,請你先簡單思考一下:有沒有更優化的實現方式呢?我們先來分析一下冒泡排序算法的時間複雜度,結合代碼我們發現冒泡排序的時間複雜度是:O(n^2),有兩次for循環,這不是一個高效的算法對吧。
  • 小技能,教你一鍵批量給圖片添加同一個水印!
    現在在網上,我們上傳下載圖片是非常輕鬆的一件事。那麼當我們自己上傳圖片的時候,為了防止圖片被他人盜用的情況出現,我們需要給圖片添加水印,保護自己的圖片。添加水印除了能保護版權外,也可以添加廣告水印,達到一定的宣傳效果。
  • 同時給100張圖片「加水印」|電腦只需簡單幾步
    現在很多的攝影師,或者攝影愛好者,都喜歡在自己拍攝的照片上,後期加個小水印,很有專屬感。就如標題所說的,今天要講的內容就是關於圖片批量添加水印的方法。今天就告訴大家一個「批量加水印」的方法,推薦一款超實用的電腦工具,可以同時加100張水印,很牛吧!
  • GIF技巧,給動圖表情包添加圖片水印的方法
    隨著表情包的大火,越來越多小夥伴開始自己製作表情包啦,之前給大家分享過一些自製表情包的方法,今天我們來聊一聊水印這個問題。我們都知道,原創圖片一般都會添加水印,所以給動圖表情包添加水印也很有必要。只不過,大部分時候我們給動圖添加水印純粹是出於好玩、有趣。
  • 有了這個水印神器,再也不用擔心圖片被盜啦
    到目前為止,關於各種盜圖侵權的事件層出不窮,既然我們做不到讓他人不要做出這樣竊取別人勞動果實的行為,那我們也只能在自身上下點功夫了,比如在圖片上傳網絡之前先給它添加上消除起來比較困難的水印。這時候大家可能會好奇:怎樣的水印不容易被消除呢?
  • 用OpenCV 去除圖片中的水印,騷操作!
    removing-watermark-out-of-an-image-using-opencv好久不見,大家好啊,最近太忙了,搞得好久沒更原創文了(說到底還是懶,),這兩天在 Stackoverflow 上面看到了一個有趣的案例,是關於OpenCV 的一個討論,討論的主題就是如何用 OpenCV 來去除下面圖片中的水印
  • 個性水印 美圖秀秀給圖片印上專屬標誌
    【IT168 應用】網上發圖加水印,現已成大家的共識,最初作用就是防盜圖、防自己照片被惡意傳播。如今的水印越來越精緻,有些還能起到裝飾美化照片的作用,當然這也是於水印製作起來比較簡單,比如在「美圖秀秀」中內置很多可愛塗鴉飾品,可以作為水印製作的素材,現在小編就來示範一下如何設計自己的專屬水印:    先看看對比圖:
  • Java中的IO流,重點概念梳理
    按照實現功能分:節點流(可以從或向一個特定的地方(節點)讀寫數據。如 FileReader)和處理流(是對一個 已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫。如 BufferedReader。處理流的構造方法總是要 帶一個其他的流對象做參數。
  • 旅行青蛙全圖鑑收集無水印 所有圖片大全
    旅行青蛙全圖鑑收集無水印你們看了嗎?一起來看看這款萌萌的遊戲的所有圖片大全吧!旅行青蛙是一款火爆社交圈的放置類遊戲,一起來看看我蛙的圖片吧!
  • java是什麼文件格式?.java文件怎麼打開?
    java是什麼文件?  Java文件是由Sun Microsystems公司於1995年5月推出的Java程序設計語言和Java平臺的總稱。用Java實現的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺、動態的Web、Internet計算。從此,Java被廣泛接受並推動了Web的迅速發展,常用的瀏覽器現在均支持Java applet。