亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java 給圖片和動圖添加水印的方法

2024-07-14 08:40:16
字體:
來源:轉載
供稿:網友

這兩天根據需求在做圖片上傳添加水印,實話說重來不知道java還可以這樣操作,既然有個這要求我就去找資料研究了一番,現在把它分享一下,希望能幫到有需要的兄弟。

給普通圖片添加水印和給動圖添加水印是不一樣的,給普通圖片添加水印用的是java自帶的方法寫的,給動圖使用了gif4j框架,這個框架在CSDN里面很多可以下載,建議下載破解版的,因為原來的jar包會有自帶的一個水印是去不了的。

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    *      目標圖片路徑    */   public void markImageByIcon(String iconPath, String srcImgPath,                     String targerPath) {     markImageByIcon(iconPath, srcImgPath, targerPath, null);   }     /**    * 給圖片添加水印圖片、可設置水印圖片旋轉角度    *    * @param iconPath    *      水印圖片路徑    * @param srcImgPath    *      源圖片路徑    * @param targerPath    *      目標圖片路徑    * @param degree    *      水印圖片旋轉角度    */   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、設置對線段的鋸齒狀邊緣處理       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、設置水印旋轉       if (null != degree) {         g.rotate(Math.toRadians(degree),             (double) buffImg.getWidth() / 2,             (double) buffImg.getHeight() / 2);       }         // 4、水印圖片的路徑 水印圖片一般為gif或者png的,這樣可設置透明度       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    *      目標圖片路徑    */   public void markImageByText(String logoText, String srcImgPath,                     String targerPath) {     markImageByText(logoText, srcImgPath, targerPath, null);   }     /**    * 給圖片添加水印文字、可設置水印文字的旋轉角度    *    * @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、設置對線段的鋸齒狀邊緣處理       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、設置水印旋轉       if (null != degree) {         g.rotate(Math.toRadians(degree),             (double) buffImg.getWidth() / 2,             (double) buffImg.getHeight() / 2);       }       // 5、設置水印文字顏色       g.setColor(color);       // 6、設置水印文字Font       g.setFont(font);       // 7、設置水印文字透明度       g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,           alpha));       // 8、第一參數->設置的內容,后面兩個參數->文字在圖片上的坐標位置(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文件,可設置寬和高    */   public void makeGif(File src, File dest, int width, int height) throws IOException {       GifImage gifImage = GifDecoder.decode(src);// 創建一個GifImage對象.       GifImage resizeIMG = GifTransformer.resize(gifImage, width, height, true);       GifEncoder.encode(resizeIMG, dest);     }    //縮放gif圖片,直接傳文件路徑,可設置寬和高   public void makeGif(String src, String dest, int width, int height) throws IOException {     GifImage gifImage = GifDecoder.decode(new File(src));// 創建一個GifImage對象.       makeGif(new File(src), new File(dest), gifImage.getScreenWidth() / 2,         gifImage.getScreenHeight() / 2);     }    //縮放gif圖片,傳文件File文件,不可設置寬和高   public void makeGif(File src, File dest) throws IOException {       GifImage gifImage = GifDecoder.decode(src);// 創建一個GifImage對象.       makeGif(src, dest, gifImage.getScreenWidth() / 2, gifImage.getScreenHeight() / 2);     }    //縮放gif圖片,傳文件路徑,不可設置寬和高   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 {       //水印初始化、設置(字體、樣式、大小、顏色)       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 = "復 印 無 效";     //圖片水印的路徑     String iconPath = "d:/2.jpg";        //添加完水印文件的輸出路徑     String targerTextPath = "d:/qie_text.jpg";     String targerTextPath2 = "d:/qie_text_rotate.jpg";     String targerIconPath = "d:/qie_icon.jpg";     String targerIconPath2 = "d:/qie_icon_rotate.jpg";       System.out.println("給圖片添加水印文字開始...");     // 給圖片添加水印文字     markImageByText(logoText, srcImgPath, targerTextPath);     // 給圖片添加水印文字,水印文字旋轉-45     markImageByText(logoText, srcImgPath, targerTextPath2, -45);     System.out.println("給圖片添加水印文字結束...");       System.out.println("給圖片添加水印圖片開始...");     setImageMarkOptions(0.3f, 1, 1, null, null);      // 給圖片添加水印圖片     markImageByIcon(iconPath, srcImgPath, targerIconPath);     // 給圖片添加水印圖片,水印圖片旋轉-45     markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45);     System.out.println("給圖片添加水印圖片結束...");       //動圖添加水?。ㄌ砑铀訄D文件,添加的水印,添加完輸出文件)     addTextWatermarkToGif(new File("d://10.gif"), "復 印 無 效", new File("d://11.gif"));     addImageWatermarkToGif(new File("d://gif//10.gif"), "d://gif//3.png", new File("d://gif//4.gif"));     }   } 

這里面有普通圖片添加水印和動圖添加水印,普通圖片添加水印方法如果傳的是動圖能添加成功,但是動圖就成靜態的了,動圖添加水印方法如果傳的是普通圖片,會直接報錯了。

這些我在做的時候都有試過,現在就當記筆記記錄在此,也希望能幫助到有需要的兄弟。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品免费久久久久久久久| 精品久久久久久久久久ntr影视| 久久资源免费视频| 影音先锋欧美在线资源| 国产女人精品视频| 国产精品99导航| 国产91成人在在线播放| 欧美日韩成人在线观看| 亚洲精品久久久久久久久久久久| 亚洲国内精品视频| 亚洲色图狂野欧美| 日韩视频免费中文字幕| 亚洲第一精品久久忘忧草社区| 久久久久久久久久久av| 亚洲天堂av在线免费| 国产在线高清精品| 国产成人精品亚洲精品| 国产精品青青在线观看爽香蕉| 精品国内产的精品视频在线观看| 国产mv免费观看入口亚洲| 国产精品高潮粉嫩av| 亚洲国产欧美日韩精品| 久久韩国免费视频| 人人做人人澡人人爽欧美| 国产一区二区三区在线观看视频| 91av免费观看91av精品在线| 国产在线精品成人一区二区三区| 97超级碰碰人国产在线观看| 日韩毛片中文字幕| www.日韩不卡电影av| 亚洲国产精品久久久| 91精品国产91久久久久久久久| 日韩欧美一区二区在线| 国产精品wwwwww| 欧美性20hd另类| 亚洲高清一区二| 538国产精品视频一区二区| 国产精品高精视频免费| 成人美女免费网站视频| 在线成人激情视频| 91黑丝在线观看| 性欧美在线看片a免费观看| 国产精品狼人色视频一区| 欧美激情啊啊啊| 97精品在线观看| 精品久久久国产精品999| 国产一区香蕉久久| 亚洲综合大片69999| 亚洲 日韩 国产第一| 97视频免费看| 91沈先生作品| 国产精品久久久久久久久久久不卡| 亚洲欧美日韩区| 日韩风俗一区 二区| 伊人久久久久久久久久久| 欧美成人精品h版在线观看| 免费91麻豆精品国产自产在线观看| 久久久久久久国产精品| 国产精品免费视频xxxx| 琪琪第一精品导航| 中文字幕亚洲欧美一区二区三区| 欧美日韩在线视频首页| 日韩在线免费高清视频| 久久久国产在线视频| 国产成人精品一区二区| 色婷婷久久av| 亚洲美女精品成人在线视频| 91在线高清免费观看| 国产精品99久久久久久久久| 欧美xxxx综合视频| 中文字幕在线成人| 国产一区二区欧美日韩| 国产成人福利网站| 黄色精品在线看| 国产日韩专区在线| 日韩免费在线播放| 国产99久久精品一区二区| 亚洲国产精品久久91精品| 欧美激情一级二级| 亚洲片国产一区一级在线观看| 国产精品老牛影院在线观看| 日韩午夜在线视频| 国产精品视频xxxx| 国产99久久精品一区二区| 国产成+人+综合+亚洲欧洲| 久久久久久久电影一区| 亚洲国产天堂久久国产91| 欧美小视频在线| 日韩av大片免费看| 久久精品国产成人| 欧美成人免费网| 日本久久久久久久| 久久久久久999| 久久久精品中文字幕| 色综合天天狠天天透天天伊人| 88国产精品欧美一区二区三区| 中文字幕亚洲自拍| 国产精品69av| 日韩成人在线视频| 久久99精品视频一区97| 欧美黑人巨大xxx极品| 亚洲日韩第一页| 日韩精品在线免费播放| 日韩精品在线观看一区二区| 亚洲第一精品夜夜躁人人爽| 亚洲欧美一区二区精品久久久| 日韩av一区二区在线| 日韩欧美中文字幕在线播放| 爽爽爽爽爽爽爽成人免费观看| 91av在线播放| 成人性生交xxxxx网站| 国产91精品青草社区| 亚洲精品视频二区| 国产亚洲精品va在线观看| 91综合免费在线| 免费99精品国产自在在线| 久久综合色88| 国产精品久久电影观看| 国产成人久久久精品一区| 亚洲美女动态图120秒| 亚洲欧美国产精品专区久久| 亚洲图片欧洲图片av| 亚洲97在线观看| 91精品国产自产91精品| 日韩成人小视频| 国产欧美精品在线播放| 91精品在线影院| 欧美激情一区二区三区久久久| 亚洲国产精品久久久| 成人午夜在线观看| 亚洲精品之草原avav久久| 国产精品丝袜久久久久久高清| 亚洲国产精品va在线看黑人| 久久久久久久爱| 在线观看国产精品日韩av| 日韩国产精品亚洲а∨天堂免| 中文字幕欧美日韩va免费视频| 日韩电影免费在线观看中文字幕| 自拍偷拍免费精品| 亚洲无亚洲人成网站77777| 最近2019中文免费高清视频观看www99| 91最新在线免费观看| 久久久久久久久久久免费| 国产精品一区二区久久久| 国产啪精品视频网站| 国产一区二区三区视频免费| 5566日本婷婷色中文字幕97| 91经典在线视频| 国产成人在线亚洲欧美| 日韩精品极品毛片系列视频| 国产精品入口福利| www.xxxx精品| 亚洲一区中文字幕| 在线观看视频99| 在线精品高清中文字幕| 国产99久久精品一区二区| 亚洲人成电影网| 国产精品亚洲片夜色在线| 亚洲欧美日韩国产成人| 有码中文亚洲精品| 国产精品成人品| 亚洲国产高清福利视频| 欧美电影免费播放| 国产精品白丝jk喷水视频一区|