/**
* @param filePath 需要添加水印的图片地址
* @param fileAddress 生成水印后的图片地址
* @param watermarkingName 水印信息
* @return
*/
public static boolean addImageWatermarking(String filePath, String fileAddress, String watermarkingName) {
try {
File newFile = new File(filePath);
Image image = ImageIO.read(newFile);/*将图片文件转换成图片*/
int width = image.getWidth(null);/*获取文件的宽*/
int height = image.getHeight(null);/*获取文件的高*/
int size = width / 300 * 10;
if (size == 0) {
size = 10;
}
Font font = new Font("宋体", Font.BOLD, size);//水印字体,大小
/*添加水印*/
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bufferedImage.createGraphics();
graphics.drawImage(image, 0, 0, width, height, null);
graphics.setColor(Color.lightGray);
graphics.setFont(font);
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));//设置水印透明度 默认为1.0 值越小颜色越浅
graphics.rotate(Math.toRadians(-45), width, height);/*设置水印旋转*/
JLabel label = new JLabel(watermarkingName);/*获取自定义水印信息*/
FontMetrics metrics = label.getFontMetrics(font);
int waterWidth = metrics.stringWidth(label.getText());//文字水印的宽
int rowsNumber = (height / waterWidth) + (height % waterWidth);// 图片的高 除以 文字水印的宽 打印的行数(以文字水印的宽为间隔)
int columnsNumber = width / waterWidth;//图片的宽 除以 文字水印的宽 每行打印的列数(以文字水印的宽为间隔)
//防止图片太小而文字水印太长,所以至少打印一次
if (rowsNumber < 1) {
rowsNumber = 1;
}
if (columnsNumber < 1) {
columnsNumber = 1;
}
for (int j = 0; j < rowsNumber; j++) {
for (int i = 0; i < columnsNumber; i++) {
graphics.drawString(watermarkingName, i * waterWidth + j * waterWidth, -i * waterWidth + j * waterWidth);//画出水印,并设置水印位置
}
}
graphics.dispose();
/*输出图片 */
FileOutputStream outputStream = new FileOutputStream(fileAddress);
ImageIO.write(bufferedImage, "jpg", outputStream);
outputStream.flush();
outputStream.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
java生成图片带有字体水印(根据图片大小动态生成水印字体大小)
最新推荐文章于 2024-07-29 16:01:44 发布