java - 在 TIFF 图像上加水印

标签 java javax.imageio twelvemonkeys

我正在尝试使用 java 在图像上添加水印。目前,我在带有 png、jpeg 扩展名的图像上放置了水印,但代码不适用于 tiff 图像。 以前它给出了空指针错误,但在包含 twelvemonkey 核心和 tiff 插件 jars 之后,空指针错误消失了,代码正在逐行执行。但输出的 tiff 图像没有水印。

            BufferedImage sourceImage = ImageIO.read(...);
            Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();

            AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
            g2d.setComposite(alphaChannel);
            g2d.setColor(Color.BLACK);
            g2d.setFont(new java.awt.Font("Times New Roman", Font.BOLD, 64));
            FontMetrics fontMetrics = g2d.getFontMetrics();
            Rectangle2D rect = fontMetrics.getStringBounds(watermarkText, g2d);

            int centerX = (sourceImage.getWidth() - (int) rect.getWidth()) / 2;
            int centerY = sourceImage.getHeight() / 2;

            FontMetrics fm = g2d.getFontMetrics();

            g2d.drawString(watermarkText, centerX, centerY);

            ImageIO.write(sourceImage,extension, outFile);

谁能提供在 tiff 图像上加水印的方法?

最佳答案

正如在问题的评论中已经指出的那样,问题可能不是您的代码“错误”,也不是 TIFF 格式的任何特定内容可以防止水印。

但是,TIFF 是一种非常灵活的格式,可以包含从 RGB、CMYK、“深色”或浮点样本到简单的索引或二值图像数据的任何内容。我怀疑问题与后者有关(如果是这样,您会遇到与某些调色板 PNG 相同的问题),因为在这些情况下,可能没有颜色可以代表您的透明黑色。但如果没有进一步的澄清,就不可能肯定地说。

通过创建完整的 RGB 内存图像、在其上绘制原始图像然后添加水印,可以轻松解决此类问题。但这会极大地改变输出文件和大小,我不知道这是否适合您的用例。


无论如何,这是一个完整的工作示例,基于您上面的代码和可验证的输入/输出文件:

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class WatermarkTest {

    private static String watermarkText = "WaterMark!";

    public static void main(String[] args) throws IOException {
        File input = new File(args[0]);
        String extension = getExtension(input);

        File output = args.length >= 2 
                ? new File(args[1]) 
                : new File(input.getParent(), input.getName().replace("." + extension, "_watermarked." + extension));

        BufferedImage sourceImage = ImageIO.read(input);
        Graphics2D g2d = sourceImage.createGraphics();

        AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
        g2d.setComposite(alphaChannel);
        g2d.setColor(Color.BLACK);
        g2d.setFont(new java.awt.Font("Times New Roman", Font.BOLD, 64));
        FontMetrics fontMetrics = g2d.getFontMetrics();
        Rectangle2D rect = fontMetrics.getStringBounds(watermarkText, g2d);

        int centerX = (sourceImage.getWidth() - (int) rect.getWidth()) / 2;
        int centerY = sourceImage.getHeight() / 2;

        g2d.drawString(watermarkText, centerX, centerY);

        g2d.dispose();

        ImageIO.write(sourceImage, extension, output);
    }

    private static String getExtension(final String fileName) {
        int index = fileName.lastIndexOf('.');

        if (index >= 0) {
            return fileName.substring(index + 1);
        }

        // No period found
        return null;
    }
}

输入图像:logo.tif

logo.tif

结果图片:logo_watermarked.tif

logo_watermarked.tif

不幸的是,上传到 Stackoverflow 将图像转换为 PNG。 TIFF 格式的原始输入和输出文件可以从 Dropbopx 下载。 .

关于java - 在 TIFF 图像上加水印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56686021/

相关文章:

Java ImageIO.write 发送的数据比 ImageIO.read 接收的多?

java - 尝试从 java 中非常大的图像文件读取区域时出错

java - 使用 Java 的 ImageIO 将像素数组转换为 Image 对象?

java - 如何将从 MongoDB 查询获得的年份和星期转换为 Joda 日期时间?

java - 在 MS SQL Server 2012 中通过 Java 动态创建存储过程

java - 流程控制,实现替换方法List

java - JFileChooser 图像到缓冲图像

tiff - 如何将ImageOutputStream的流保留在内存中?

java - 使用 Java 添加 Tiff 图像颜色配置文件(sRGB 或 Adob​​e 1998)

java - 在文本文档中查找以 notification 开头的行并将其删除