利用jdk API 为图片添加文本水印
1.为了方便我把需要的信息封装成了一个类, ImageInfo 类
package com.demo.water.image.bean;
import java.awt.Color;
import java.awt.Font;
import java.io.InputStream;
public class ImageInfo {
/**
* 图片的输入流
*/
private InputStream inputStream;
/**
* 水印效果文字的设置
*/
private String fontName = "微软雅黑";
private int fontStyle = Font.PLAIN;
private int fontSize = 20;
/**
* 文字的颜色
*/
private Color fontColor = Color.BLUE;
/**
* 文字的透明度 0 - 1 之间
*/
private float composite = 1f;
/**
* 文字的内容
*/
private String content;
/**
* 图片的格式和要存储的路径
* location 是利用imageType作为图片的后缀名的,所以输location的时候只需要输到图片的名字即可
*/
private String imageType = "jpg";
private String location;
public String getImageType() {
return imageType;
}
public void setImageType(String imageType) {
this.imageType = imageType;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getFontName() {
return fontName;
}
public void setFontName(String fontName) {
this.fontName = fontName;
}
public int getFontStyle() {
return fontStyle;
}
public void setFontStyle(int fontStyle) {
this.fontStyle = fontStyle;
}
public int getFontSize() {
return fontSize;
}
public void setFontSize(int fontSize) {
this.fontSize = fontSize;
}
public Color getFontColor() {
return fontColor;
}
public void setFontColor(Color fontColor) {
this.fontColor = fontColor;
}
public float getComposite() {
return composite;
}
public void setComposite(float composite) {
this.composite = composite;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public ImageInfo(InputStream inputStream, String fontName, int fontStyle, int fontSize, Color fontColor,
float composite, String content, String location) {
this(inputStream, content, location);
this.fontName = fontName;
this.fontStyle = fontStyle;
this.fontSize = fontSize;
this.fontColor = fontColor;
this.composite = composite;
}
public ImageInfo(InputStream inputStream, String content, String location) {
this.inputStream = inputStream;
this.content = content;
this.location = location + "." + imageType;
}
public ImageInfo() {}
public ImageInfo(InputStream inputStream, Color fontColor, float composite, String content, String location) {
this(inputStream, content, location);
this.fontColor = fontColor;
this.composite = composite;
}
public ImageInfo(InputStream inputStream, String fontName, int fontStyle, int fontSize, String content, String location) {
this(inputStream, content, location);
this.fontName = fontName;
this.fontStyle = fontStyle;
this.fontSize = fontSize;
}
}
2,主要是 ImageUtil 里面的处理逻辑,大家可以看一下
package com.demo.water.image.util;
import java.awt.AlphaComposite;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.demo.water.image.bean.ImageInfo;
public class ImageUtil {
public static boolean waterImage(ImageInfo imageInfo){
try {
//获取传进来的图片的信息 ImageIO.read 返回的对象就是输入那个对象的信息了
Image image = ImageIO.read(imageInfo.getInputStream());
//创建缓存图片 BufferedImage.TYPE_INT_RGB 那种普通的 RGB颜色,这个参数我没怎么研究
BufferedImage bufImg = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
//获取绘图工具
Graphics2D g = bufImg.createGraphics();
//设置绘图工具的一些基本信息
g.setFont(new Font(imageInfo.getFontName(), imageInfo.getFontStyle(), imageInfo.getFontSize()));
g.setColor(imageInfo.getFontColor());
//把图片写到缓存图片的位置上 如果需要把图片也实现透明度处理,那么把它放到 g.setComposite 后面即可
g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);
//这个是设置透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, imageInfo.getComposite()));
//添加水印的文字
g.drawString(imageInfo.getContent(), 0, imageInfo.getFontSize());
//释放工具
g.dispose();
//把缓存图片写到磁盘上
return ImageIO.write(bufImg, imageInfo.getImageType(), new File(imageInfo.getLocation()));
} catch (Exception e) {
e.printStackTrace();
} finally {
if(imageInfo.getInputStream() != null) {
try {
imageInfo.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
}
这里只是做了一个 demo ,我只处理了把文字放到左上角显示,文字也没有限制,也只是存到了磁盘的某一个位置,大家自己根据业务改一下即可
接下来是例子 ll.jpg 是原图 zxc.jpg 是添加文本水印后的图片
ll.jpg
zcx.jpg
这是一个最简单的demo了,大家根据自己需求改进一下即可使用,还有另外一种说法是用 com.sun.image.codec.jpeg.JPEGImageEncoder
和com.sun.image.codec.jpeg.JPEGCodec 这两个类处理,但是eclipse好像默认不允许使用这两个类,网上有说解决办法,我的弄不了,可能是因为我的jdk是1.8的吧
大家也可以自己试一下。
好的,谢谢大家、