备注
- 使用java的Graphics2D来为图片添加水印,不需要额外的依赖,还是非常方便的
- 适应的场景也不必局限与添加水印,还可以用来生成证书图片、盖章等等
- 这里两个方法也是只用传参即可,可以写个工具类复制过去,没事用着玩
图片添加文字水印
public static BufferedImage imageAddText(BufferedImage originalImage, int watermarkX, int watermarkY,
float alpha, String text, Color color, String font, int style, int size){
try {
BufferedImage watermarkedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) watermarkedImage.getGraphics();
g2d.drawImage(originalImage, 0, 0, null);
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2d.setComposite(alphaComposite);
g2d.setColor(color);
Font watermarkFont = new Font(font, style, size);
g2d.setFont(watermarkFont);
g2d.drawString(text, watermarkX, watermarkY);
ImageIO.write(watermarkedImage, "jpg", new File("newImage.jpg"));
g2d.dispose();
System.out.println("Watermark added successfully.");
return watermarkedImage;
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
图片加图片水印
public static BufferedImage imageAddImage(BufferedImage originalImage, BufferedImage watermarkImage,
int watermarkWidth,int watermarkHeight,int watermarkX,int watermarkY,float alpha){
try {
BufferedImage watermarkedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) watermarkedImage.getGraphics();
g2d.drawImage(originalImage, 0, 0, null);
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2d.setComposite(alphaComposite);
if (watermarkX == 0 || watermarkY == 0) {
watermarkX = watermarkImage.getWidth();
watermarkY = watermarkImage.getHeight();
}
g2d.drawImage(watermarkImage, watermarkX, watermarkY, watermarkWidth, watermarkHeight, null);
ImageIO.write(watermarkedImage, "jpg", new File("newImage.jpg"));
g2d.dispose();
System.out.println("Watermark added successfully.");
return watermarkedImage;
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
测试
public static void main(String[] args) {
try {
BufferedImage originalImage = ImageIO.read(new File("C:\\Users\\x\\Pictures\\template.png"));
BufferedImage watermarkImage = ImageIO.read(new File("C:\\Users\\x\\Pictures\\watermark.jpg"));
watermarkImage = imageAddImage(originalImage, watermarkImage, 200, 100, 50, 50, 1.0f);
watermarkImage = imageAddText(watermarkImage, 100, 150, 0.5f, "水印文字", Color.BLACK, "宋体", Font.PLAIN, 20);
String outputImagePath = "C:\\Users\\x\\Pictures\\newImage.jpg";
ImageIO.write(watermarkImage, "jpg", new File(outputImagePath));
} catch (IOException e) {
e.printStackTrace();
}
}
文字乱码
- 如果本地(windows)测试无问题,但部署到线上环境(centos7)会出现文字乱码,可能是字体缺失导致的
- 创建字体目录
mkdir -p /usr/share/fonts/chinese
- 上传字体,复制C:\Windows\Fonts下对应字体,后缀改为ttf(例如:宋体.ttf),上传到创建的目录下
- 安装字体索引工具
yum install -y mkfontscale
yum install -y fontconfig
- 安装字体
cd /usr/share/fonts/chinese
mkfontscale
mkfontdir
fc-cache