這篇文章將為大家詳細講解有關Java如何實現(xiàn)給圖片添加圖片水印,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供長清企業(yè)網(wǎng)站建設,專注與網(wǎng)站設計制作、成都網(wǎng)站建設、成都h5網(wǎng)站建設、小程序制作等業(yè)務。10年已為長清眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設計公司優(yōu)惠進行中。
本文實例講述了Java實現(xiàn)給圖片添加圖片水印,文字水印及馬賽克的方法。分享給大家供大家參考,具體如下:
可以在eclipse中新建個Utils類,把以下代碼復制進去直接使用,以下方法實現(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; //水印旋轉角度-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加載到內(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軸默認是從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);
//呈現(xiàn)一個圖像,在繪制前進行從圖像空間到用戶空間的轉換
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加載到內(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軸默認是從0坐標開始
int x = 0;
int y = (height/2)-(icheight/2);
//設置對線段的鋸齒狀邊緣處理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//呈現(xiàn)一個圖像,在繪制前進行從圖像空間到用戶空間的轉換
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);
//根據(jù)圖片的背景設置水印顏色
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);
//根據(jù)圖片的背景設置水印顏色
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方向繪制個數(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坐標
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如何實現(xiàn)給圖片添加圖片水印”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
當前標題:Java如何實現(xiàn)給圖片添加圖片水印
文章位置:http://chinadenli.net/article24/ipscce.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設計、域名注冊、企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)