您的位置:首页 > 编程语言 > Java开发

利用jdk API 为图片添加文本水印

2017-06-28 15:17 417 查看
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的吧

大家也可以自己试一下。

好的,谢谢大家、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: