Java图片合成,添加水印

近期公司网站有个需求,需要对网站上的产品图片进行添加水印处理,通过网上搜索了下,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()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值