近期公司网站有个需求,需要对网站上的产品图片进行添加水印处理,通过网上搜索了下,JDK自带有相关的方法。整合了相关代码如下:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* 给图片添加水印
*
* @author danny
*/
public class MarkImageUtils {
/**
* 给图片加水印、可设置水印图片旋转角度
* @param iconPath 水印图片路径
* @param srcImgPath 源图路径
* @param targerPath 合成目标图片路径
* @param degree 水印图片旋转角度 为null则不需要处理
*/
public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath, Integer degree) {
OutputStream os = null;
try {
Image srcImg= Toolkit.getDefaultToolkit().getImage(srcImgPath);
BufferedImage buffImg=BufferedImageBuilder.toBufferedImage(srcImg);
// 得到画笔对象
Graphics2D g = buffImg.createGraphics();
// 设置对线段的锯齿状边缘处理
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1f)); //透明度设置开始
g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_AREA_AVERAGING), 0,
0, null);
if (null != degree) {
// 设置水印旋转
g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
}
// 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
ImageIcon imgIcon = new ImageIcon(iconPath);
// 得到Image对象。
Image img = imgIcon.getImage();
float alpha = 1f; // 透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
int waterWidth = (int) (buffImg.getWidth() * 0.18);
int waterHeight = (int) (buffImg.getHeight() * 0.1);
// 表示水印图片的位置
g.drawImage(img, buffImg.getWidth()-waterWidth-20,buffImg.getHeight() -waterHeight-15, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
g.dispose();
os = new FileOutputStream(targerPath);
// 生成图片
ImageIO.write(buffImg, "JPG", os);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
String srcImgPath = "C:\\watsons\\demo\\input.jpg";
String iconPath = "C:\\watsons\\demo\\shuiyin.png";
String targerPath2 = "C:\\watsons\\demo\\output.jpg";
// 给图片添加水印,不进行旋转
markImageByIcon(iconPath, srcImgPath, targerPath2, null);
}
}
另外还需要对原网站的图片进行处理,原网站的产品图片是利用富文本进行编辑处理的。需要对富文本进行解析
富文本类似如下
<body>
<p><img src=""><img src="" style="font-size: 14px;"><br></p>
</body>
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
//利用Jsoup库进行html的解析
Element doc = Jsoup.parseBodyFragment(desc).body();
//解析其中的img标签
Elements pngs = doc.select("img[src]");
for (Element element : pngs) {
String imgUrl = element.attr("src");
//由于富文本中的图片是放在阿里云oss上面的,需要下载下来进行处理
URL url1 = new URL(imgUrl);
URLConnection uc = url1.openConnection();
InputStream inputStream = uc.getInputStream();
//下载图片
String targerPath2 = temPath + System.currentTimeMillis() + ".jpg";
FileOutputStream out = new FileOutputStream(targerPath2);
int j = 0;
while ((j = inputStream.read()) != -1) {
out.write(j);
}
inputStream.close();
//对接下载的图片进行合并水印处理,然后重新上传得到图片链接
AliOssUploadDto aliOssUploadDto = aliOssFileService.uploadImg(new File(targerPath2));
//更新富文本图片新地址
element.attr("src", aliOssUploadDto.getUrl());
}
//得到替换完图片的富文本
doc.toString()