最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 給圖片和動(dòng)圖添加水印的方法

 更新時(shí)間:2018年04月22日 12:56:21   作者:TheSmallWhite  
本篇文章主要介紹了Java 給圖片和動(dòng)圖添加水印的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

給普通圖片添加水印和給動(dòng)圖添加水印是不一樣的,給普通圖片添加水印用的是java自帶的方法寫的,給動(dòng)圖使用了gif4j框架,這個(gè)框架在CSDN里面很多可以下載,建議下載破解版的,因?yàn)樵瓉淼膉ar包會(huì)有自帶的一個(gè)水印是去不了的。

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)容,后面兩個(gè)參數(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(); 
      } 
    } 
  } 
   
  /*********** 動(dòng)圖加水印 ************/ 
  
  /** 
   * 縮放gif圖片,直接傳的File文件,可設(shè)置寬和高 
   */ 
  public void makeGif(File src, File dest, int width, int height) throws IOException { 
      GifImage gifImage = GifDecoder.decode(src);// 創(chuàng)建一個(gè)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)建一個(gè)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)建一個(gè)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));   
  } 
  
  /** 
   * 動(dòng)圖中加文字水印 
   */ 
  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); 
  } 
  
  /** 
   * 動(dòng)圖中加圖片水印 
   */ 
  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 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); 
    // 給圖片添加水印文字,水印文字旋轉(zhuǎn)-45 
    markImageByText(logoText, srcImgPath, targerTextPath2, -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, targerIconPath2, -45); 
    System.out.println("給圖片添加水印圖片結(jié)束..."); 
  
    //動(dòng)圖添加水?。ㄌ砑铀?dòng)圖文件,添加的水印,添加完輸出文件) 
    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"));   
  }   
} 

這里面有普通圖片添加水印和動(dòng)圖添加水印,普通圖片添加水印方法如果傳的是動(dòng)圖能添加成功,但是動(dòng)圖就成靜態(tài)的了,動(dòng)圖添加水印方法如果傳的是普通圖片,會(huì)直接報(bào)錯(cuò)了。

這些我在做的時(shí)候都有試過,現(xiàn)在就當(dāng)記筆記記錄在此,也希望能幫助到有需要的兄弟。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot+Docker+IDEA實(shí)現(xiàn)一鍵構(gòu)建+推送、運(yùn)行、同鏡像多容器啟動(dòng)

    SpringBoot+Docker+IDEA實(shí)現(xiàn)一鍵構(gòu)建+推送、運(yùn)行、同鏡像多容器啟動(dòng)

    這篇文章主要介紹了SpringBoot+Docker+IDEA實(shí)現(xiàn)一鍵構(gòu)建+推送、運(yùn)行、同鏡像多容器啟動(dòng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改

    使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改

    最近項(xiàng)目需要在JPA中使用ID進(jìn)行批量更新,所以下面這篇文章主要給大家介紹了關(guān)于使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Java高并發(fā)下鎖的優(yōu)化詳解

    Java高并發(fā)下鎖的優(yōu)化詳解

    這篇文章主要介紹了Java高并發(fā)下鎖的優(yōu)化詳解,鎖是最常用的同步方法之一,在高并發(fā)的環(huán)境下,激烈的鎖競爭會(huì)導(dǎo)致程序的性能下降,下面是一些關(guān)于鎖的使用建議,可以把這種副作用降到最低,需要的朋友可以參考下
    2024-01-01
  • Spring Boot配置application.yml及根據(jù)application.yml選擇啟動(dòng)配置的操作方法

    Spring Boot配置application.yml及根據(jù)application.yml選擇啟動(dòng)配置的操作

    Spring Boot中可以選擇applicant.properties 作為配置文件,也可以通過在application.yml中進(jìn)行配置,讓Spring Boot根據(jù)你的選擇進(jìn)行加載啟動(dòng)配置文件,本文給大家介紹Spring Boot配置application.yml及根據(jù)application.yml選擇啟動(dòng)配置的操作方法,感興趣的朋友一起看看吧
    2023-10-10
  • Springboot編寫CRUD時(shí)訪問對應(yīng)數(shù)據(jù)函數(shù)返回null的問題及解決方法

    Springboot編寫CRUD時(shí)訪問對應(yīng)數(shù)據(jù)函數(shù)返回null的問題及解決方法

    我在學(xué)習(xí)springboot,其中在編寫CRUD時(shí)發(fā)現(xiàn)訪問數(shù)據(jù)的函數(shù)執(zhí)行下去返回值是null但是其它部分正常,這篇文章主要介紹了Springboot在編寫CRUD時(shí),訪問對應(yīng)數(shù)據(jù)函數(shù)返回null,需要的朋友可以參考下
    2024-02-02
  • Java 鎖的知識(shí)總結(jié)及實(shí)例代碼

    Java 鎖的知識(shí)總結(jié)及實(shí)例代碼

    這篇文章主要介紹了Java 鎖的知識(shí)總結(jié)及實(shí)例代碼,需要的朋友可以參考下
    2016-09-09
  • SpringBoot與SpringCache概念用法大全

    SpringBoot與SpringCache概念用法大全

    這篇文章主要介紹了SpringBoot與SpringCache的概念及基本用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • spring源碼閱讀--aop實(shí)現(xiàn)原理講解

    spring源碼閱讀--aop實(shí)現(xiàn)原理講解

    這篇文章主要介紹了spring源碼閱讀--aop實(shí)現(xiàn)原理講解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解決Spring AOP 同類調(diào)用失效問題

    解決Spring AOP 同類調(diào)用失效問題

    這篇文章主要介紹了解決Spring AOP 同類調(diào)用失效問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java未賦值變量的初始值解析(默認(rèn)值)

    Java未賦值變量的初始值解析(默認(rèn)值)

    這篇文章主要介紹了Java未賦值變量的初始值(默認(rèn)值),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

张家川| 陈巴尔虎旗| 崇礼县| 灵台县| 南丰县| 镇远县| 舟山市| 定边县| 辛集市| 漾濞| 临江市| 辽中县| 临沂市| 晋中市| 永宁县| 英德市| 丹阳市| 黔西| 富宁县| 伊川县| 财经| 江津市| 梅河口市| 宁国市| 闻喜县| 图木舒克市| 涿州市| 平邑县| 高清| 彭泽县| 黄骅市| 望江县| 岳阳市| 建平县| 台州市| 郁南县| 元朗区| 秀山| 吴江市| 临澧县| 临高县|