国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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("給圖片添加水印圖片結束...");       //動圖添加水印(添加水印動圖文件,添加的水印,添加完輸出文件)     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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禹州市| 南京市| 怀安县| 绥芬河市| 宝清县| 吴堡县| 伊金霍洛旗| 安阳县| 肇庆市| 兴仁县| 闽清县| 呼伦贝尔市| 平山县| 清远市| 新沂市| 固镇县| 陆川县| 江川县| 湾仔区| 涞水县| 大丰市| 华安县| 长汀县| 商都县| 明光市| 荣成市| 长岭县| 新余市| 云龙县| 邹平县| 会泽县| 屏东市| 南部县| 虹口区| 鹤峰县| 西安市| 丹寨县| 石棉县| 松原市| 大洼县| 乌恰县|