最近要做个红包分享的功能,分享完成后要弹出一个页面,提示某某某获得多少元红包。其中一步是在原有图片基础上添加用户头像和用户名的水印。像一些网站的图片一般也会打上网站的标志,比如CSDN下方的水印。
来一个给红包添加水印的demo,代码如下
package nosence;
/**
* @author uiao
* @Title: 给图片加图片和文字水印
* @date 2018/8/1519:35
*/
import org.apache.log4j.Logger;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
public class WaterMarkUtil {
private static Font shareFont = new Font("微软雅黑", Font.PLAIN, 40);
private static Color shareColor = new Color(255, 255, 255, 255);
private static Logger logger = Logger.getLogger(WaterMarkUtil.class);
/**
* @param srcImgPath 源图片路径
* @param markImgPath 水印图片路径
* @param tarImgPath 保存的图片路径
* @param waterMarkContent 水印内容
*/
public static void addWaterMark(String srcImgPath, String markImgPath, String tarImgPath, String waterMarkContent) {
try {
// 读取原图片信息
File srcImgFile = new File(srcImgPath);
Image srcImg = ImageIO.read(srcImgFile);
int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
int srcImgHeight = srcImg.getHeight(null);//获取图片的高
// 读取水印图片信息
File markImgFile = new File(markImgPath);
Image markImg = ImageIO.read(markImgFile);
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
// 绘制图像
Graphics2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
g.setColor(shareColor);
g.setFont(shareFont);
// 70为头像宽度,30为头像和文字间距
int x = (srcImgWidth - getWatermarkLength(waterMarkContent, g) - 70 - 30) / 2;
int y = srcImgHeight / 2 - 100;
// 给图片加图片水印
g.drawImage(markImg, x, y, 70, 70, null);
// 给图片加文字水印
g.drawString(waterMarkContent, x + 100, y + 50);
g.dispose();
// 输出图片
FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
ImageIO.write(bufImg, "jpg", outImgStream);
logger.info("水印添加完成");
outImgStream.flush();
outImgStream.close();
} catch (Exception e) {
logger.info("水印添加失败");
e.printStackTrace();
}
}
/**
* 获取文字的宽度
*
* @param waterMarkContent
* @param g
* @return
*/
private static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
}
测试类
package nosence;
/**
* @author uiao
* @Title: 测试水印生成效果
* @date 2018/8/1714:41
*/
public class WaterMarkTest {
public static void main(String[] args) {
String srcImgPath = "C:\\Users\\Administrator\\Desktop\\coder\\three_red_packet_1080.jpg"; // 源图片地址
String markImgPath = "C:\\Users\\Administrator\\Desktop\\coder\\avatar.jpg"; // 水印图片地址
String tarImgPath = "C:\\Users\\Administrator\\Desktop\\coder\\water_marked_after.jpg"; //目的地址
String waterMarkContent = "南安安"; //水印内容
WaterMarkUtil.addWaterMark(srcImgPath, markImgPath, tarImgPath, waterMarkContent);
}
}
添加水印之前的图片
加上水印之后的图片