首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TIFF图像水印

TIFF图像水印
EN

Stack Overflow用户
提问于 2019-06-20 12:28:36
回答 1查看 733关注 0票数 1

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

代码语言:javascript
复制
            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图像上加水印的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-21 08:30:15

正如对问题的注释中已经指出的,问题不可能是您的代码“错误”,或者TIFF格式中有任何特定的内容可以防止水印。

然而,TIFF是一种非常灵活的格式,可以包含任何内容,从RGB、CMYK、“深颜色”或浮点样本,到简单的索引或双层图像数据。我怀疑这个问题与后者有关(如果是的话,一些调色板PNG也会出现同样的问题),因为在这些情况下,可能没有颜色可以表示透明的黑色。但如果没有进一步的澄清,这是不可能确定的。

很容易解决这样的问题,通过创建一个完整的RGB内存图像,把你的原始画在上面,然后添加水印。但是这将极大地改变输出文件和大小,而且我不知道这对于您的用例是否可以接受。

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

代码语言:javascript
复制
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_watermarked.tif

不幸的是,上传到堆栈溢出将图像转换为PNG。TIFF格式的原始输入和输出文件可以从德罗波普下载。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56686021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档