Java 图片加水印代码示例:使用宋体字倾斜水印
String pressText = '茜蓓尔专用水印';
Color color = Color.BLACK;
Font font = new Font('宋体', Font.PLAIN, 48);
int x = 0;
int y = 0;
float alpha = 0.7f;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
pressText(getInputStream('https://geeko-app-sg.oss-ap-southeast-1.aliyuncs.com/listing//1c647T8T226n7A30689n1U8W8L.jpg',10000,10000),outputStream, pressText, color, font, x, y, alpha);
public static void pressText(InputStream srcStream, OutputStream destStream, String pressText, Color color, Font font, int x, int y, float alpha) throws IOException {
BufferedImage srcImg = ImageIO.read(srcStream);
// 创建新的图片,设置透明度
BufferedImage destImg = new BufferedImage(srcImg.getWidth(), srcImg.getHeight(), BufferedImage.TYPE_INT_ARGB); // 修改图片类型为TYPE_INT_ARGB
Graphics2D g = destImg.createGraphics();
destImg = g.getDeviceConfiguration().createCompatibleImage(srcImg.getWidth(), srcImg.getHeight(), Transparency.TRANSLUCENT);
g.dispose();
g = destImg.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
// 设置抗锯齿和渲染字体平滑
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
// 设置字体和颜色
g.setFont(font);
g.setColor(color);
// 设置倾斜文字
AffineTransform transform = new AffineTransform();
transform.setToShear(0.2, 0);
g.setTransform(transform);
// 计算文字的宽度和高度
int textWidth = g.getFontMetrics().stringWidth(pressText);
int textHeight = g.getFontMetrics().getHeight();
// 平铺水印文字
for (int i = 0; i < srcImg.getWidth(); i += textWidth) {
for (int j = 0; j < srcImg.getHeight(); j += textHeight) {
g.drawString(pressText, i + x, j + y);
}
}
g.dispose();
// 将处理后的图片写入输出流
ImageIO.write(destImg, 'JPEG', destStream);
}
代码说明:
pressText: 水印文字内容color: 水印颜色font: 水印字体,这里使用宋体x: 水印文字的起始横坐标y: 水印文字的起始纵坐标alpha: 水印的透明度,取值范围0.0到1.0,0.0为完全透明,1.0为完全不透明
关键修改:
- 将
BufferedImage destImg = new BufferedImage(srcImg.getWidth(), srcImg.getHeight(), BufferedImage.TYPE_INT_RGB);修改为BufferedImage destImg = new BufferedImage(srcImg.getWidth(), srcImg.getHeight(), BufferedImage.TYPE_INT_ARGB);,这将使新的图片拥有透明度,从而保留原图片的透明部分。
注意:
- 以上代码使用 Java ImageIO 类库进行图片处理,需要导入相关包。
- 调整代码中的参数,可以自定义水印的样式。
- 此代码仅供参考,实际使用中可能需要根据具体情况进行调整。
原文地址: https://www.cveoy.top/t/topic/qkXf 著作权归作者所有。请勿转载和采集!