本文實例講述了Java實現給圖片添加圖片水印,文字水印及馬賽克的方法。分享給大家供大家參考,具體如下:
可以在eclipse中新建個Utils類,把以下代碼複製進去直接使用,以下方法實現單個或多個水印的添加
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; //水印旋轉角度-45,null表示不旋轉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); }/** * 給圖片不同位置添加多個圖片水印、可設置水印圖片旋轉角度* @param icon 水印圖片路徑(如:F:/images/icon.png) * @param source 沒有加水印的圖片路徑(如:F:/images/6.jpg) * @param output 加水印後的圖片路徑(如:F:/images/) * @param imageName 圖片名稱(如:11111) * @param imageType 圖片類型(如:jpg) * @param degree 水印圖片旋轉角度,為null表示不旋轉*/ 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加載到內存中Image ic = ImageIO.read(ficon); //icon高度int icheight = ic.getHeight(null); //將源圖片讀到內存中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); //創建一個指定BufferedImage 的Graphics2D 對象Graphics2D g = bi.createGraphics(); //x,y軸默認是從0坐標開始int x = 0; int y = 0; //默認兩張水印圖片的間隔高度是水印圖片的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; } //設置對線段的鋸齒狀邊緣處理g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); //呈現一個圖像,在繪製前進行從圖像空間到用戶空間的轉換g.drawImage(img.getScaledInstance(width,height,Image.SCALE_SMOOTH),0,0,null); for(int i=0;i<space;i++){ if (null != degree) { //設置水印旋轉g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2); } //水印圖像的路徑水印一般為gif或者png的,這樣可設置透明度ImageIcon imgIcon = new ImageIcon(icon); //得到Image對象。 Image con = imgIcon.getImage(); //透明度,最小值為0,最大值為1 float clarity = 0.6f; g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,clarity)); //表示水印圖片的坐標位置(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; }/** * 給圖片添加單個圖片水印、可設置水印圖片旋轉角度* @param icon 水印圖片路徑(如:F:/images/icon.png) * @param source 沒有加水印的圖片路徑(如:F:/images/6.jpg) * @param output 加水印後的圖片路徑(如:F:/images/) * @param imageName 圖片名稱(如:11111) * @param imageType 圖片類型(如:jpg) * @param degree 水印圖片旋轉角度,為null表示不旋轉*/ 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加載到內存中Image ic = ImageIO.read(ficon); //icon高度int icheight = ic.getHeight(null); //將源圖片讀到內存中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); //創建一個指定BufferedImage 的Graphics2D 對象Graphics2D g = bi.createGraphics(); //x,y軸默認是從0坐標開始int x = 0; int y = (height/2)-(icheight/2); //設置對線段的鋸齒狀邊緣處理g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); //呈現一個圖像,在繪製前進行從圖像空間到用戶空間的轉換g.drawImage(img.getScaledInstance(width,height,Image.SCALE_SMOOTH),0,0,null); if (null != degree) { //設置水印旋轉g.rotate(Math.toRadians(degree),(double) bi.getWidth() / 2, (double) bi.getHeight() / 2); } //水印圖像的路徑水印一般為gif或者png的,這樣可設置透明度ImageIcon imgIcon = new ImageIcon(icon); //得到Image對象。 Image con = imgIcon.getImage(); //透明度,最小值為0,最大值為1 float clarity = 0.6f; g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,clarity)); //表示水印圖片的坐標位置(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; } /** * 給圖片添加多個文字水印、可設置水印文字旋轉角度* @param source 需要添加水印的圖片路徑(如:F:/images/6.jpg) * @param outPut 添加水印後圖片輸出路徑(如:F:/images/) * @param imageName 圖片名稱(如:11111) * @param imageType 圖片類型(如:jpg) * @param color 水印文字的顏色* @param word 水印文字* @param degree 水印文字旋轉角度,為null表示不旋轉*/ 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); //設置水印字體樣式Font font = new Font("宋體", Font.PLAIN, size); //根據圖片的背景設置水印顏色g.setColor(color); int x = width/3; int y = size; int space = height/size; for(int i=0;i<space;i++){ //如果最後一個坐標的y軸比height高,直接退出if((y+size)>height){ break; } if (null != degree) { //設置水印旋轉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; } /** * 給圖片添加單個文字水印、可設置水印文字旋轉角度* @param source 需要添加水印的圖片路徑(如:F:/images/6.jpg) * @param outPut 添加水印後圖片輸出路徑(如:F:/images/) * @param imageName 圖片名稱(如:11111) * @param imageType 圖片類型(如:jpg) * @param color 水印文字的顏色* @param word 水印文字* @param degree 水印文字旋轉角度,為null表示不旋轉*/ 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); //設置水印字體樣式Font font = new Font("宋體", Font.PLAIN, 50); //根據圖片的背景設置水印顏色g.setColor(color); if (null != degree) { //設置水印旋轉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方向繪製個數int ycount = 0; //y方向繪製個數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坐標int y = 0;//y坐標//繪製馬賽克(繪製矩形並填充顏色) 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坐標} y = 0;// 還原y坐標x = x + size;// 計算x坐標} g.dispose(); File sf = new File(output, imageName+"."+imageType); ImageIO.write(bi, imageType, sf); // 保存圖片result = "打馬賽克成功"; }catch(Exception e){ e.printStackTrace(); } return result; }}更多java相關內容感興趣的讀者可查看本站專題:《Java圖片操作技巧匯總》、《java日期與時間操作技巧匯總》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》及《Java數據結構與算法教程》。
希望本文所述對大家java程序設計有所幫助。