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

首頁 > 開發(fā) > Java > 正文

Java實現(xiàn)給圖片添加圖片水印,文字水印及馬賽克的方法示例

2024-07-13 10:17:01
字體:
供稿:網(wǎng)友

本文實例講述了Java實現(xiàn)給圖片添加圖片水印,文字水印及馬賽克的方法。分享給大家供大家參考,具體如下:

可以在eclipse中新建個Utils類,把以下代碼復(fù)制進去直接使用,以下方法實現(xiàn)單個或多個水印的添加

package com.rzxt.fyx.common.util;import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.Image;import java.awt.RenderingHints;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;import javax.swing.ImageIcon;/** * 給圖片添加水印 * @author tgy * */public class MarkImageUtils {  /**   * @param args   */  public static void main(String[] args) {  String output = "F:/images/";    String source = "F:/images/6.jpg";  //源圖片路徑    String icon = "F:/images/icon2.png"; //覆蓋圖片路徑    String imageName = "mark_image"; //圖片名稱    String imageType = "jpg"; //圖片類型jpg,jpeg,png,gif    String text = "加水印了";    int size = 4;  //馬賽克大小    Integer degree = null; //水印旋轉(zhuǎn)角度-45,null表示不旋轉(zhuǎn)    String result = null;    //給圖片添加圖片水印    result = MarkImageUtils.markImageByMoreIcon(icon,source,output,imageName,imageType,degree);//    result = MarkImageUtils.markImageBySingleIcon(icon, source, output, imageName, imageType, degree);//    //給圖片添加文字水印//    result = MarkImageUtils.markImageByMoreText(source,output,imageName,imageType,Color.red,text,degree);//    result = MarkImageUtils.markImageBySingleText(source,output,imageName,imageType,Color.red,text,degree);//    //給圖片打馬賽克//    result = MarkImageUtils.markImageByMosaic(source,output,imageName,imageType,size);    System.out.println(result);  }/**   * 給圖片不同位置添加多個圖片水印、可設(shè)置水印圖片旋轉(zhuǎn)角度   * @param icon 水印圖片路徑(如:F:/images/icon.png)   * @param source 沒有加水印的圖片路徑(如:F:/images/6.jpg)   * @param output 加水印后的圖片路徑(如:F:/images/)   * @param imageName 圖片名稱(如:11111)   * @param imageType 圖片類型(如:jpg)   * @param degree 水印圖片旋轉(zhuǎn)角度,為null表示不旋轉(zhuǎn)   */  public static String markImageByMoreIcon(String icon,String source,String output,String imageName,String imageType,Integer degree) {    String result = "添加圖片水印出錯";    try {    File file = new File(source);    File ficon = new File(icon);    if (!file.isFile()) {      return source + " 不是一個圖片文件!";    }      //將icon加載到內(nèi)存中      Image ic = ImageIO.read(ficon);      //icon高度      int icheight = ic.getHeight(null);      //將源圖片讀到內(nèi)存中      Image img = ImageIO.read(file);      //圖片寬      int width = img.getWidth(null);      //圖片高      int height = img.getHeight(null);      BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);      //創(chuàng)建一個指定 BufferedImage 的 Graphics2D 對象      Graphics2D g = bi.createGraphics();      //x,y軸默認(rèn)是從0坐標(biāo)開始      int x = 0;      int y = 0;      //默認(rèn)兩張水印圖片的間隔高度是水印圖片的1/3      int temp = icheight/3;      int space = 1;      if(height>=icheight){      space = height/icheight;      if(space>=2){      temp = y = icheight/2;      if(space==1||space==0){      x = 0;      y = 0;      }      }      }else{      x = 0;      y = 0;      }      //設(shè)置對線段的鋸齒狀邊緣處理      g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);      //呈現(xiàn)一個圖像,在繪制前進行從圖像空間到用戶空間的轉(zhuǎn)換      g.drawImage(img.getScaledInstance(width,height,Image.SCALE_SMOOTH),0,0,null);      for(int i=0;i<space;i++){      if (null != degree) {        //設(shè)置水印旋轉(zhuǎn)        g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2);      }      //水印圖象的路徑 水印一般為gif或者png的,這樣可設(shè)置透明度      ImageIcon imgIcon = new ImageIcon(icon);      //得到Image對象。      Image con = imgIcon.getImage();      //透明度,最小值為0,最大值為1      float clarity = 0.6f;      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,clarity));      //表示水印圖片的坐標(biāo)位置(x,y)      //g.drawImage(con, 300, 220, null);      g.drawImage(con, x, y, null);      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));      y+=(icheight+temp);      }      g.dispose();      File sf = new File(output, imageName+"."+imageType);    ImageIO.write(bi, imageType, sf); // 保存圖片      result = "圖片完成添加Icon水印";    } catch (Exception e) {      e.printStackTrace();    }    return result;  }/**   * 給圖片添加單個圖片水印、可設(shè)置水印圖片旋轉(zhuǎn)角度   * @param icon 水印圖片路徑(如:F:/images/icon.png)   * @param source 沒有加水印的圖片路徑(如:F:/images/6.jpg)   * @param output 加水印后的圖片路徑(如:F:/images/)   * @param imageName 圖片名稱(如:11111)   * @param imageType 圖片類型(如:jpg)   * @param degree 水印圖片旋轉(zhuǎn)角度,為null表示不旋轉(zhuǎn)   */  public static String markImageBySingleIcon(String icon,String source,String output,String imageName,String imageType,Integer degree) {    String result = "添加圖片水印出錯";    try {    File file = new File(source);    File ficon = new File(icon);    if (!file.isFile()) {      return source + " 不是一個圖片文件!";    }      //將icon加載到內(nèi)存中      Image ic = ImageIO.read(ficon);      //icon高度      int icheight = ic.getHeight(null);      //將源圖片讀到內(nèi)存中      Image img = ImageIO.read(file);      //圖片寬      int width = img.getWidth(null);      //圖片高      int height = img.getHeight(null);      BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);      //創(chuàng)建一個指定 BufferedImage 的 Graphics2D 對象      Graphics2D g = bi.createGraphics();      //x,y軸默認(rèn)是從0坐標(biāo)開始      int x = 0;      int y = (height/2)-(icheight/2);      //設(shè)置對線段的鋸齒狀邊緣處理      g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);      //呈現(xiàn)一個圖像,在繪制前進行從圖像空間到用戶空間的轉(zhuǎn)換      g.drawImage(img.getScaledInstance(width,height,Image.SCALE_SMOOTH),0,0,null);      if (null != degree) {        //設(shè)置水印旋轉(zhuǎn)        g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2);      }      //水印圖象的路徑 水印一般為gif或者png的,這樣可設(shè)置透明度      ImageIcon imgIcon = new ImageIcon(icon);      //得到Image對象。      Image con = imgIcon.getImage();      //透明度,最小值為0,最大值為1      float clarity = 0.6f;      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,clarity));      //表示水印圖片的坐標(biāo)位置(x,y)      //g.drawImage(con, 300, 220, null);      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); // 保存圖片      result = "圖片完成添加Icon水印";    } catch (Exception e) {      e.printStackTrace();    }    return result;  }  /**   * 給圖片添加多個文字水印、可設(shè)置水印文字旋轉(zhuǎn)角度   * @param source 需要添加水印的圖片路徑(如:F:/images/6.jpg)   * @param outPut 添加水印后圖片輸出路徑(如:F:/images/)   * @param imageName 圖片名稱(如:11111)   * @param imageType 圖片類型(如:jpg)   * @param color 水印文字的顏色   * @param word 水印文字   * @param degree 水印文字旋轉(zhuǎn)角度,為null表示不旋轉(zhuǎn)   */  public static String markImageByMoreText(String source,String output,String imageName,String imageType,Color color,String word,Integer degree) {    String result = "添加文字水印出錯";  try {      //讀取原圖片信息      File file = new File(source);      if (!file.isFile()) {      return file + " 不是一個圖片文件!";    }      Image img = ImageIO.read(file);      //圖片寬      int width = img.getWidth(null);      //圖片高      int height = img.getHeight(null);      //文字大小      int size = 50;      //加水印      BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);      Graphics2D g = bi.createGraphics();      g.drawImage(img, 0, 0, width, height, null);      //設(shè)置水印字體樣式      Font font = new Font("宋體", Font.PLAIN, size);      //根據(jù)圖片的背景設(shè)置水印顏色      g.setColor(color);      int x = width/3;      int y = size;      int space = height/size;      for(int i=0;i<space;i++){      //如果最后一個坐標(biāo)的y軸比height高,直接退出      if((y+size)>height){      break;      }      if (null != degree) {        //設(shè)置水印旋轉(zhuǎn)        g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2);      }      g.setFont(font);      //水印位置      g.drawString(word, x, y);      y+=(2*size);      }      g.dispose();      //輸出圖片      File sf = new File(output, imageName+"."+imageType);    ImageIO.write(bi, imageType, sf); // 保存圖片      result = "圖片完成添加Word水印";    } catch (Exception e) {      e.printStackTrace();    }  return result;  }  /**   * 給圖片添加單個文字水印、可設(shè)置水印文字旋轉(zhuǎn)角度   * @param source 需要添加水印的圖片路徑(如:F:/images/6.jpg)   * @param outPut 添加水印后圖片輸出路徑(如:F:/images/)   * @param imageName 圖片名稱(如:11111)   * @param imageType 圖片類型(如:jpg)   * @param color 水印文字的顏色   * @param word 水印文字   * @param degree 水印文字旋轉(zhuǎn)角度,為null表示不旋轉(zhuǎn)   */  public static String markImageBySingleText(String source,String output,String imageName,String imageType,Color color,String word,Integer degree) {    String result = "添加文字水印出錯";  try {      //讀取原圖片信息      File file = new File(source);      if (!file.isFile()) {      return file + " 不是一個圖片文件!";    }      Image img = ImageIO.read(file);      int width = img.getWidth(null);      int height = img.getHeight(null);      //加水印      BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);      Graphics2D g = bi.createGraphics();      g.drawImage(img, 0, 0, width, height, null);      //設(shè)置水印字體樣式      Font font = new Font("宋體", Font.PLAIN, 50);      //根據(jù)圖片的背景設(shè)置水印顏色      g.setColor(color);      if (null != degree) {        //設(shè)置水印旋轉(zhuǎn)        g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2);      }      g.setFont(font);      int x = width/3;      int y = height/2;      //水印位置      g.drawString(word, x, y);      g.dispose();      //輸出圖片      File sf = new File(output, imageName+"."+imageType);    ImageIO.write(bi, imageType, sf); // 保存圖片      result = "圖片完成添加Word水印";    } catch (Exception e) {      e.printStackTrace();    }  return result;  }  /**   * 給圖片加馬賽克   * @param source 原圖片路徑(如:F:/images/6.jpg)   * @param output 打馬賽克后,圖片保存的路徑(如:F:/images/)   * @param imageName 圖片名稱(如:11111)   * @param imageType 圖片類型(如:jpg)   * @param size 馬賽克尺寸,即每個矩形的寬高   * @return   */  public static String markImageByMosaic(String source,String output,String imageName,String imageType,int size){  String result = "圖片打馬賽克出錯";  try{    File file = new File(source);    if (!file.isFile()) {      return file + " 不是一個圖片文件!";    }    BufferedImage img = ImageIO.read(file); // 讀取該圖片    int width = img.getWidth(null); //原圖片寬      int height = img.getHeight(null); //原圖片高    BufferedImage bi = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB);    //馬賽克格尺寸太大或太小    if (width < size || height < size) {      return "馬賽克格尺寸太大";    }    if(size<=0){     return "馬賽克格尺寸太小";    }    int xcount = 0; //x方向繪制個數(shù)    int ycount = 0; //y方向繪制個數(shù)    if (width % size == 0) {      xcount = width / size;    } else {      xcount = width / size + 1;    }    if (height % size == 0) {      ycount = height / size;    } else {      ycount = height / size + 1;    }    int x = 0; //x坐標(biāo)    int y = 0;//y坐標(biāo)    //繪制馬賽克(繪制矩形并填充顏色)    Graphics2D g = bi.createGraphics();    for (int i = 0; i < xcount; i++) {      for (int j = 0; j < ycount; j++) {        //馬賽克矩形格大小        int mwidth = size;        int mheight = size;        if(i==xcount-1){  //橫向最后一個不夠一個size          mwidth = width-x;        }        if(j == ycount-1){ //縱向最后一個不夠一個size          mheight = height-y;        }        //矩形顏色取中心像素點RGB值        int centerX = x;        int centerY = y;        if (mwidth % 2 == 0) {          centerX += mwidth / 2;        } else {          centerX += (mwidth - 1) / 2;        }        if (mheight % 2 == 0) {          centerY += mheight / 2;        } else {          centerY += (mheight - 1) / 2;        }        Color color = new Color(img.getRGB(centerX, centerY));        g.setColor(color);        g.fillRect(x, y, mwidth, mheight);        y = y + size;// 計算下一個矩形的y坐標(biāo)      }      y = 0;// 還原y坐標(biāo)      x = x + size;// 計算x坐標(biāo)    }    g.dispose();    File sf = new File(output, imageName+"."+imageType);    ImageIO.write(bi, imageType, sf); // 保存圖片    result = "打馬賽克成功";  }catch(Exception e){  e.printStackTrace();  }    return result;  }}

希望本文所述對大家java程序設(shè)計有所幫助。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沅江市| 靖安县| 资溪县| 辽宁省| 色达县| 华安县| 开原市| 岐山县| 乳源| 弥勒县| 什邡市| 卓资县| 梓潼县| 嵊泗县| 中方县| 鸡东县| 宝兴县| 武冈市| 宁蒗| 筠连县| 鄢陵县| 浑源县| 舟曲县| 汉源县| 长春市| 嘉鱼县| 武安市| 修武县| 米泉市| 襄垣县| 六枝特区| 河南省| 定西市| 三明市| 雅安市| 应用必备| 临城县| 洪雅县| 德格县| 离岛区| 通化市|