我试图使用java在图像上添加水印。目前,我使用png,jpeg在图像上添加水印,但代码并不适用于tiff图像。以前,它给出了空指针错误,但是在包含了十二键核心和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图像上加水印的方法吗?
发布于 2019-06-21 08:30:15
正如对问题的注释中已经指出的,问题不可能是您的代码“错误”,或者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_watermarked.tif

不幸的是,上传到堆栈溢出将图像转换为PNG。TIFF格式的原始输入和输出文件可以从德罗波普下载。
https://stackoverflow.com/questions/56686021
复制相似问题