這篇文章主要介紹Java如何給圖片和動圖添加水印,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司:公司2013年成立為各行業(yè)開拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為近千家公司企業(yè)提供了專業(yè)的網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計(jì)和網(wǎng)站推廣服務(wù), 定制網(wǎng)站建設(shè)由設(shè)計(jì)師親自精心設(shè)計(jì),設(shè)計(jì)的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據(jù)客戶的實(shí)際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。
給普通圖片添加水印和給動圖添加水印是不一樣的,給普通圖片添加水印用的是java自帶的方法寫的,給動圖使用了gif4j框架,這個框架在CSDN里面很多可以下載,建議下載破解版的,因?yàn)樵瓉淼膉ar包會有自帶的一個水印是去不了的。
import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; import javax.swing.ImageIcon; //這下面是 gif4j 框架的類 import com.gif4j.GifDecoder; import com.gif4j.GifEncoder; import com.gif4j.GifImage; import com.gif4j.GifTransformer; import com.gif4j.TextPainter; import com.gif4j.Watermark; /** * Created by ZXD on 2018/1/18. */ public class ImageRemarkUtil { // 水印透明度 private float alpha = 0.5f; // 水印橫向位置 private int positionWidth = 150; // 水印縱向位置 private int positionHeight = 300; //水印寬 private int width = 80; //水印高 private int height = 80; // 水印文字字體 private Font font = new Font("宋體", Font.BOLD, 72); // 水印文字顏色 private Color color = Color.red; /***********普通圖片加水印***********/ /** * * @param alpha * 水印透明度 * @param positionWidth * 水印橫向位置 * @param positionHeight * 水印縱向位置 * @param font * 水印文字字體 * @param color * 水印文字顏色 */ public void setImageMarkOptions(float alpha, int positionWidth, int positionHeight,int width,int height, Font font, Color color) { if (alpha != 0.0f) this.alpha = alpha; if (positionWidth != 0) this.positionWidth = positionWidth; if (positionHeight != 0) this.positionHeight = positionHeight; if (height != 0) this.height = height; if (width != 0) this.width = width; if (font != null) this.font = font; if (color != null) this.color = color; } /** * 給圖片添加水印圖片 * * @param iconPath * 水印圖片路徑 * @param srcImgPath * 源圖片路徑 * @param targerPath * 目標(biāo)圖片路徑 */ public void markImageByIcon(String iconPath, String srcImgPath, String targerPath) { markImageByIcon(iconPath, srcImgPath, targerPath, null); } /** * 給圖片添加水印圖片、可設(shè)置水印圖片旋轉(zhuǎn)角度 * * @param iconPath * 水印圖片路徑 * @param srcImgPath * 源圖片路徑 * @param targerPath * 目標(biāo)圖片路徑 * @param degree * 水印圖片旋轉(zhuǎn)角度 */ public void markImageByIcon(String iconPath, String srcImgPath, String targerPath, Integer degree) { OutputStream os = null; try { Image srcImg = ImageIO.read(new File(srcImgPath)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 1、得到畫筆對象 Graphics2D g = buffImg.createGraphics(); // 2、設(shè)置對線段的鋸齒狀邊緣處理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage( srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); // 3、設(shè)置水印旋轉(zhuǎn) if (null != degree) { g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); } // 4、水印圖片的路徑 水印圖片一般為gif或者png的,這樣可設(shè)置透明度 ImageIcon imgIcon = new ImageIcon(iconPath); // 5、得到Image對象。 Image img = imgIcon.getImage(); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); Integer X = srcImg.getWidth(null); Integer Y = srcImg.getHeight(null); // 6、水印圖片的位置 g.drawImage(img, X-(positionWidth+width), Y-(positionHeight+height),width,height,null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); // 7、釋放資源 g.dispose(); // 8、生成圖片 os = new FileOutputStream(targerPath); ImageIO.write(buffImg, "JPG", os); System.out.println("圖片完成添加水印圖片"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 給圖片添加水印文字 * * @param logoText * 水印文字 * @param srcImgPath * 源圖片路徑 * @param targerPath * 目標(biāo)圖片路徑 */ public void markImageByText(String logoText, String srcImgPath, String targerPath) { markImageByText(logoText, srcImgPath, targerPath, null); } /** * 給圖片添加水印文字、可設(shè)置水印文字的旋轉(zhuǎn)角度 * * @param logoText * @param srcImgPath * @param targerPath * @param degree */ public void markImageByText(String logoText, String srcImgPath, String targerPath, Integer degree) { InputStream is = null; OutputStream os = null; try { // 1、源圖片 Image srcImg = ImageIO.read(new File(srcImgPath)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 2、得到畫筆對象 Graphics2D g = buffImg.createGraphics(); // 3、設(shè)置對線段的鋸齒狀邊緣處理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage( srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); // 4、設(shè)置水印旋轉(zhuǎn) if (null != degree) { g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); } // 5、設(shè)置水印文字顏色 g.setColor(color); // 6、設(shè)置水印文字Font g.setFont(font); // 7、設(shè)置水印文字透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 8、第一參數(shù)->設(shè)置的內(nèi)容,后面兩個參數(shù)->文字在圖片上的坐標(biāo)位置(x,y) g.drawString(logoText, positionWidth, positionHeight); // 9、釋放資源 g.dispose(); // 10、生成圖片 os = new FileOutputStream(targerPath); ImageIO.write(buffImg, "JPG", os); System.out.println("圖片完成添加水印文字"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != is) is.close(); } catch (Exception e) { e.printStackTrace(); } try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } /*********** 動圖加水印 ************/ /** * 縮放gif圖片,直接傳的File文件,可設(shè)置寬和高 */ public void makeGif(File src, File dest, int width, int height) throws IOException { GifImage gifImage = GifDecoder.decode(src);// 創(chuàng)建一個GifImage對象. GifImage resizeIMG = GifTransformer.resize(gifImage, width, height, true); GifEncoder.encode(resizeIMG, dest); } //縮放gif圖片,直接傳文件路徑,可設(shè)置寬和高 public void makeGif(String src, String dest, int width, int height) throws IOException { GifImage gifImage = GifDecoder.decode(new File(src));// 創(chuàng)建一個GifImage對象. makeGif(new File(src), new File(dest), gifImage.getScreenWidth() / 2, gifImage.getScreenHeight() / 2); } //縮放gif圖片,傳文件File文件,不可設(shè)置寬和高 public void makeGif(File src, File dest) throws IOException { GifImage gifImage = GifDecoder.decode(src);// 創(chuàng)建一個GifImage對象. makeGif(src, dest, gifImage.getScreenWidth() / 2, gifImage.getScreenHeight() / 2); } //縮放gif圖片,傳文件路徑,不可設(shè)置寬和高 public void makeGif(String src, String dest) throws IOException { makeGif(new File(src), new File(dest)); } /** * 動圖中加文字水印 */ public void addTextWatermarkToGif(File src, String watermarkText, File dest)throws IOException { //水印初始化、設(shè)置(字體、樣式、大小、顏色) TextPainter textPainter = new TextPainter(new Font("黑體", Font.ITALIC, 12)); textPainter.setOutlinePaint(Color.WHITE); BufferedImage renderedWatermarkText = textPainter.renderString(watermarkText, true); //圖片對象 GifImage gf = GifDecoder.decode(src); //獲取圖片大小 int iw = gf.getScreenWidth(); int ih = gf.getScreenHeight(); //獲取水印大小 int tw = renderedWatermarkText.getWidth(); int th = renderedWatermarkText.getHeight(); //水印位置 Point p = new Point(); p.x = iw - tw - 5; p.y = ih - th - 4; //加水印 Watermark watermark = new Watermark(renderedWatermarkText, p); gf = watermark.apply(GifDecoder.decode(src), true); //輸出 GifEncoder.encode(gf, dest); } /** * 動圖中加圖片水印 */ public void addImageWatermarkToGif(File src, String watermarkPath, File dest){ try{ BufferedImage renderedWatermarkText = ImageIO.read(new File(watermarkPath)); //圖片對象 GifImage gf = GifDecoder.decode(src); //獲取圖片大小 int iw = gf.getScreenWidth(); int ih = gf.getScreenHeight(); //獲取水印大小 int tw = renderedWatermarkText.getWidth(); int th = renderedWatermarkText.getHeight(); //水印位置 Point p = new Point(); p.x = iw-tw-20; p.y = ih-th-20; //加水印 Watermark watermark = new Watermark(renderedWatermarkText, p); //水印透明度 watermark.setTransparency(1); gf = watermark.apply(GifDecoder.decode(src), false); //輸出 GifEncoder.encode(gf, dest); } catch (IOException e){ e.printStackTrace(); } } public static void main(String[] args) { //需要加水印圖片的路徑 String srcImgPath = "d:/1.jpg"; String logoText = "復(fù) 印 無 效"; //圖片水印的路徑 String iconPath = "d:/2.jpg"; //添加完水印文件的輸出路徑 String targerTextPath = "d:/qie_text.jpg"; String targerTextPath3 = "d:/qie_text_rotate.jpg"; String targerIconPath = "d:/qie_icon.jpg"; String targerIconPath3 = "d:/qie_icon_rotate.jpg"; System.out.println("給圖片添加水印文字開始..."); // 給圖片添加水印文字 markImageByText(logoText, srcImgPath, targerTextPath); // 給圖片添加水印文字,水印文字旋轉(zhuǎn)-45 markImageByText(logoText, srcImgPath, targerTextPath3, -45); System.out.println("給圖片添加水印文字結(jié)束..."); System.out.println("給圖片添加水印圖片開始..."); setImageMarkOptions(0.3f, 1, 1, null, null); // 給圖片添加水印圖片 markImageByIcon(iconPath, srcImgPath, targerIconPath); // 給圖片添加水印圖片,水印圖片旋轉(zhuǎn)-45 markImageByIcon(iconPath, srcImgPath, targerIconPath3, -45); System.out.println("給圖片添加水印圖片結(jié)束..."); //動圖添加水?。ㄌ砑铀訄D文件,添加的水印,添加完輸出文件) addTextWatermarkToGif(new File("d:\\10.gif"), "復(fù) 印 無 效", new File("d:\\11.gif")); addImageWatermarkToGif(new File("d:\\gif\\10.gif"), "d:\\gif\\3.png", new File("d:\\gif\\4.gif")); } }
這里面有普通圖片添加水印和動圖添加水印,普通圖片添加水印方法如果傳的是動圖能添加成功,但是動圖就成靜態(tài)的了,動圖添加水印方法如果傳的是普通圖片,會直接報(bào)錯了。
這些我在做的時(shí)候都有試過,現(xiàn)在就當(dāng)記筆記記錄在此,也希望能幫助到有需要的兄弟。
以上是“Java如何給圖片和動圖添加水印”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文標(biāo)題:Java如何給圖片和動圖添加水印
文章起源:http://www.rwnh.cn/article4/gcgjoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、、虛擬主機(jī)、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)