public static void main String pressText = 茜蓓尔专用水印; Color color = ColorBLACK; Font font = new Font宋体 FontPLAIN 48; int x = 0; int y = 0; float alpha = 07f; ByteArray
根据您提供的代码,发现有两个可能导致图片只有水印没有图片的问题:
-
图片读取问题:在
pressText方法中,使用ImageIO.read(srcStream)读取图片时,可能无法正确读取到图片流,导致srcImg为空。建议检查图片的路径是否正确,以及网络连接是否正常。 -
绘制透明图片问题:在创建
destImg时,使用Transparency.TRANSLUCENT参数来设置图片的透明度,但后续没有将srcImg绘制到destImg中。这可能导致destImg仅包含透明背景,而没有图片内容。建议将srcImg绘制到destImg中后再添加水印。
下面是修改后的代码示例:
public static void main(){
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);
Graphics2D g = destImg.createGraphics();
// 绘制原始图片
g.drawImage(srcImg, 0, 0, null);
// 设置透明度
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, "PNG", destStream);
}
这样修改后,应该可以正确绘制带水印的图片,并保存到输出流 destStream 中
原文地址: https://www.cveoy.top/t/topic/iEl3 著作权归作者所有。请勿转载和采集!