记一次Java给图片添加水印方法
Java给图片在指定位置加水印的小工具, 可操作文件, 或者http地址图片,转base64或者直接输出都可
核心代码先贴出来
水印基本信息的一个封装
import lombok.AllArgsConstructor;
import lombok.Data;
import java.awt.*;
/**
* @author maple
*/
@Data
@AllArgsConstructor
public class ImageDTO {
/**
* 文字内容
*/
private String text;
/**
* 字体颜色和透明度
*/
private Color color;
/**
* 文字内容
*/
private Font font;
/**
* 横坐标
*/
private Integer x;
/**
* 纵坐标
*/
private Integer y;
}
核心操作工具
我的需求是拿到一个图片http地址, 往指定位置加文字, 再转成base64返回给前端
如果是File文件的,请看注释
/**
* @param imageUrl 源图片路径
* @param list 水印信息, list是可以再图片上加多次文字
* @return base64
*/
private String writeImage(String imageUrl, List<ImageDTO> list) {
try {
InputStream inputStream = new DataInputStream(new URL(imageUrl).openStream());
//获取原图片信息 文件转化为图片
Image srcImg = ImageIO.read(inputStream);
//获取图片的宽
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);
for (ImageDTO imgDTO : list) {
//根据图片的背景设置水印颜色
g.setColor(imgDTO.getColor());
//设置字体
g.setFont(imgDTO.getFont());
// 消除锯齿 --- 这个真的是关键了
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//画出水印
g.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY());
}
g.dispose();
// 下面是转base64
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(bufImg, "png", outputStream);
BASE64Encoder encoder = new BASE64Encoder();
// 如果要输出图片
// outImgStream = new FileOutputStream(targetImgPath);
// ImageIO.write(bufImg, "jpg", outImgStream);
return "data:image/jpg;base64," + encoder.encodeBuffer(outputStream.toByteArray()).trim().replaceAll("\n", "").replaceAll("\r", "");
} catch (Exception e) {
log.error("==== 系统异常::{} ====", e.getMessage());
throw new RuntimeException(e);
}
}
- 如果是具体的文件路径, 将转图片的方式稍作改变即可
* 此处的imgPath是一个具体的位置 比如说 /Users/xxx/Desktop/test.png
* File img = new File(imgPath)
* Image image = ImageIO.read(img);
最终使用方式
public static void main(String[] args) {
List<ImageDTO> dtoList = new ArrayList<>();
// text1
dtoList.add(new ImageDTO("水印文字1", new Color(234, 109, 128),
new Font("宋体", Font.BOLD, 39),
105,
138));
// text2
dtoList.add(new ImageDTO("水印文字2", new Color(234, 109, 128),
new Font(宋体, Font.BOLD, 52),
450,
230));
// text3
dtoList.add(new ImageDTO("水印文字3", new Color(235, 113, 133),
new Font(宋体, Font.BOLD, 22),
80,
615));
String base64 = writeImage("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png", dtoList);
// 文件路径方式
// String base64 = writeImage("/Users/xxx/Desktop/rs7.jpeg", dtoList);
}
重点参数解读
- Font(“字体”, 字体类型, 字体大小(磅))
字体类型取值
Font.PLAIN(普通)
Font.BOLD(加粗)
Font.ITALIC(斜体)
Font.BOLD+ Font.ITALIC(粗斜体) - Color(r, g, b) rgb不多说了吧