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 类库进行图片处理,需要导入相关包。
  • 调整代码中的参数,可以自定义水印的样式。
  • 此代码仅供参考,实际使用中可能需要根据具体情况进行调整。
Java 图片加水印代码示例:使用宋体字倾斜水印

原文地址: https://www.cveoy.top/t/topic/qkXf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录