根据您提供的代码,发现有两个可能导致图片只有水印没有图片的问题:

  1. 图片读取问题:在 pressText 方法中,使用 ImageIO.read(srcStream) 读取图片时,可能无法正确读取到图片流,导致 srcImg 为空。建议检查图片的路径是否正确,以及网络连接是否正常。

  2. 绘制透明图片问题:在创建 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

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

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

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