功能入口
/**
* @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构建就可以了
结束就这么多欢迎指正