Java实现图片增加水印图片,水印文字

功能入口

/**
   * @param imgUrl 要处理的图片地址
   * @param watermarkImagesUrl 水印图片地址
   * @param watermarkTexts 水印文字集合
   * @param rotationAngle 水印文字角度
   * @param imagesName 处理后的图片名
   * @return
   * @throws IOException
   */
  public String cartedMiage(
      String imgUrl,
      String watermarkImagesUrl,
      List<String> watermarkTexts,
      double rotationAngle,
      String imagesName,
      Integer fontSize,
      Integer linespacing)
      throws IOException {
    URL url = new URL(imgUrl);
    // 将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
    Image srcImg = ImageIO.read(url.openStream());
    // 获取图片的宽
    int srcImgWidth = srcImg.getWidth(null);
    // 获取图片的高
    int srcImgHeight = srcImg.getHeight(null);
    BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
    // 加水印
    // 创建画笔
    Graphics2D g = bufImg.createGraphics();
    // 绘制原始图片
    g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
    if (StringUtils.isNotBlank(watermarkImagesUrl)) {
    //添加水印图片
      addAPictureWatermark(g, watermarkImagesUrl, srcImgWidth, srcImgHeight);
    }
    if (CollectionUtils.isNotEmpty(watermarkTexts)) {
    //添加水印文字
      addTextWatermark(
          g, watermarkTexts, rotationAngle, srcImgWidth, srcImgHeight, fontSize, linespacing);
    }
    g.dispose();
    //类上面加这个就不报错了-->@Slf4j
    log.info("添加水印完成");
//文件上传到阿里云
    return uploadFileOss(imagesName, bufImg);
  }

上传文件到阿里云

/**
   * 上传文件到阿里云
   *
   * @param imagesName 生成文件后的图片名称
   * @param bufImg 缓冲文件
   * @return
   * @throws IOException
   */
  private String uploadFileOss(String imagesName, BufferedImage bufImg) throws IOException {
    String ossUrl = "";

    // 待存储的地址
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer
        .append(System.getProperty("user.dir"))
        //生成文件的位置
        .append("/xcb-common/src/main/java/com/xcb/common/utils/ImageProcessing/")
        .append(imagesName)
        .append("xcb.jpg");
    String tarImgPath = stringBuffer.toString();
    FileOutputStream outImgStream = null;
    File file = null;
    try {
      // 输出图片
      outImgStream = new FileOutputStream(tarImgPath);
      ImageIO.write(bufImg, "png", outImgStream);
      file = new File(tarImgPath);
      // 图片上传至阿里云
      ossUrl = aliyunOssService.uploadFile(imagesName + "xcb.jpg", "", new FileInputStream(file));
    } catch (FileNotFoundException e) {
      log.error("生成图片异常{}", e.getMessage());
    } finally {
      if (Objects.nonNull(file)) {
      //删除文件
        FileUtil.del(file);
      }
      if (Objects.nonNull(outImgStream)) {
       //刷新流
        outImgStream.flush();
        // 关闭流
        outImgStream.close();
      }
    }
    log.info("图片上传完成");
    return ossUrl;
  }

图片水印

/**
   * 图片水印
   *
   * @param g 画笔
   * @param watermarkImagesUrl 水印图片网络地址
   * @param srcImgWidth 图片宽度
   * @param srcImgHeight 图片高度
   * @throws IOException
   */
  private void addAPictureWatermark(
      Graphics2D g, String watermarkImagesUrl, int srcImgWidth, int srcImgHeight)
      throws IOException {

    // 水印文件
    URL waterMarkImage = new URL(watermarkImagesUrl);
    // 将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
    Image srcWaterMark = ImageIO.read(waterMarkImage.openStream());
    // 获取水印图片的宽度
    int widthWaterMark = srcWaterMark.getWidth(null);
    // 获取水印图片的高度
    int heightWaterMark = srcWaterMark.getHeight(null);

    // 设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.6f));
    // 绘制水印图片  坐标为中间位置
    g.drawImage(
        srcWaterMark,
        (srcImgWidth - widthWaterMark) / 2,
        (srcImgHeight - heightWaterMark) / 2,
        widthWaterMark,
        heightWaterMark,
        null);
  }

文字水印

/**
   * 文字水印
   *
   * @param g 画笔
   * @param watermarkTexts 水印文本集合一个为一行
   * @param rotationAngle 文本角度
   * @param srcImgWidth 图片宽度
   * @param srcImgHeight 图片高度
   * @param fontSize 字体大小默认值14
   * @param linespacing 字体间距 默认值0
   */
  private void addTextWatermark(
      Graphics2D g,
      List<String> watermarkTexts,
      double rotationAngle,
      int srcImgWidth,
      int srcImgHeight,
      Integer fontSize,
      Integer linespacing) {
    fontSize = Objects.nonNull(fontSize) ? fontSize : 14;
    linespacing = Objects.nonNull(linespacing) ? linespacing : 0;
    g.setColor(Color.red);
    // 设置字体  画笔字体样式为微软雅黑,加粗,文字大小为60pt
    g.setFont(new Font("微软雅黑", Font.PLAIN, fontSize));
    // 设置水印的坐标(为原图片中间位置)
    int x = 0;
    int y = srcImgHeight / 2 + fontSize + 5;
    //    旋转角度:中心点旋转
    g.rotate(rotationAngle, x, y);
    for (String watermarkText : watermarkTexts) {
      x = (srcImgWidth - getWatermarkLength(watermarkText, g)) / 2;
      // 画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
      g.drawString(watermarkText, x, y);
      y += fontSize;
      y += linespacing;
    }
  }

获取水印文字的长度

/**
   * 获取水印文字的长度
   *
   * @param waterMarkContent
   * @param g
   * @return
   */
  public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
    return g.getFontMetrics(g.getFont())
        .charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
  }

引入的文件

import cn.hutool.core.io.FileUtil;
import com.xcb.common.utils.DateUtils;
import com.xcb.common.utils.aliyOss.AliyunOssService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Objects;

自己写一个上传文件服务

  @Autowired private AliyunOssService aliyunOssService;

问题:

部署到服务器会出现中文方框字,
本地有字体一般不会出现方块,
如果是本地的那么就忽略下面的内容。
部署到服务器需要在服务器上加入字体

我是docker部署的服务所以要加一些配置

字体文件:微软雅黑.ttf

dockerFile文件:


FROM openjdk:8
COPY fonts/微软雅黑.ttf /usr/share/fonts/
VOLUME /tmp
# 设置系统编码
ENV LANG C.UTF-8
WORKDIR app
COPY *.jar /app.jar
CMD ["--server.port=8091"]
ENV TZ=Asia/Shanghai
EXPOSE 8091
ENTRYPOINT ["java","-jar","/app.jar"]

在这里插入图片描述

要放到同级及目录下哦
在这里插入图片描述
然后Jenkins构建就可以了

结束就这么多欢迎指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值