Java 给图片和动图添加水印的方法

网友投稿 457 2023-02-08


Java 给图片和动图添加水印的方法

这两天根据需求在做图片上传添加水印,实话说重来不知道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 http://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 targehttp://rTextPath2 = "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"));

}

}

这里面有普通图片添加水印和动图添加水印,普通图片添加水印方法如果传的是动图能添加成功,但是动图就成静态的了,动图添加水印方法如果传的是普通图片,会直接报错了。

这些我在做的时候都有试过,现在就当记笔记记录在此,也希望能帮助到有需要的兄弟。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue移动端实现下拉刷新
下一篇:打开连接共享文件夹为空(显示我的电脑共享文件夹为空)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~