最近的一个小项目需要用到图片合成,所以研究了一下Graphics2D。要使用Graphics2D进行图片操作,首先需要知道这么个玩意
BufferedImage
管他是啥,反正就是用来存你的图片数据,比如长宽高,编码啥的,详细百度去
我用的时候是前端上传图片,所以接收的类是MultipartFile
也就是转换成BufferedImage
[Java] 纯文本查看 复制代码 BufferedImage read =ImageIO.read(imgFile.getInputStream());
这里引出来了另一个东西
ImageIO
这个是啥?(百度去)我们这就用其中的两个方法
ImageIO.read
这个方法是用来读取InputStream然后转化为BufferedImage
我用的是MultipartFile的getInputStream获取InputStream,你也可以用其他方法获取InputStream,比如new FileInputStream(path)方法
ImageIO.write
跟read相对,这个是用来输出的,所以入参就是BufferedImage,图片类型,OutputStream(输出流)
[Java] 纯文本查看 复制代码 ImageIO.write(image, "png", new File(path));
Graphics2D
然后就是重头戏了Graphics2D,图片操作
其中的方法很多,就不一一介绍了,想知道的可以去下载一个jkd8的api中文文档,里面有这些,我主要说一下我用到的
[Java] 纯文本查看 复制代码 /**
* [url=home.php?mod=space&uid=952169]@Param[/url] buffImg 源文件(图片)
* @param waterImg 水印文件(图片)二维码图片
* @param x 距离右下角的X偏移量
* @param y 距离右下角的Y偏移量
* @param alpha 透明度, 选择值从0.0~1.0: 完全透明~完全不透明
* [url=home.php?mod=space&uid=155549]@Return[/url] BufferedImage
* @throws IOException
* @Title: 构造图片
* @Description: 生成水印并返回java.awt.image.BufferedImage
*/
public static BufferedImage watermark(BufferedImage buffImg, BufferedImage waterImg, int x, int y, float alpha) throws IOException {
// 获取底图
// BufferedImage buffImg = ImageIO.read(file);
// 获取层图
// BufferedImage waterImg = ImageIO.read(waterFile);
// 创建Graphics2D对象,用在底图对象上绘图
Graphics2D g2d = buffImg.createGraphics();
int waterImgWidth = waterImg.getWidth();// 获取层图的宽度
int waterImgHeight = waterImg.getHeight();// 获取层图的高度
// 在图形和图像中实现混合和透明效果
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
// 绘制
g2d.drawImage(waterImg, x, y, waterImgWidth, waterImgHeight, null);
g2d.dispose();// 释放图形上下文使用的系统资源
return buffImg;
}
setComposite想实现图片透明可以用这个,alpha就是透明度,取值范围0-1
drawImage
这个是重点,第一个参数类型是BufferedImage,也就是用来传入水印图片(你要加到图片上的图片。。)
第二,第三个参数对应的是x和y,也就是合成的图片左上角的坐标,单位是像素,数据类型整数(别管那零点几了!)
第四第五个参数是宽和高,对应的是水印图片的宽和高
最后就是dispose,释放图形上下文使用的系统资源,就结束语呗,必须有,不然之后系统崩了,别说我没提醒
然后就没了,就这么简单。
附加一个增加文字水印的代码
[Java] 纯文本查看 复制代码 /**
* @param waterMarkContent 水印内容
* @param markContentColor 水印颜色
* @param font 水印字体
*/
public static Object addWaterMark(BufferedImage buffImg, int x, int y, String waterMarkContent, Color markContentColor, Font font) {
Graphics2D g2d = buffImg.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setColor(markContentColor);
g2d.setFont(font);
// 打印字符串,例如:g2d.drawString(text, x, y);
g2d.drawString(waterMarkContent, x, y);
g2d.dispose();
return null;
}
|