在 TIFF 图像上加水印
Watermarking on TIFF image
我正在尝试使用 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图片上加水印?
正如问题的评论中已经指出的那样,问题可能不是您的代码是 "wrong" 或者 TIFF 格式有什么特定的东西可以防止加水印。
但是,TIFF 是一种非常灵活的格式,可以包含从 RGB、CMYK、"deep color" 或浮点样本到简单的索引或二值图像数据的任何内容。我怀疑问题与后者有关(如果是这样,您会遇到与某些调色板 PNG 相同的问题),因为在这些情况下,可能没有颜色可以代表您的透明黑色。但如果没有进一步的澄清,就不可能肯定地说。
通过创建完整的 RGB in-memory 图像,在其上绘制原始图像,然后添加水印,可以轻松解决此类问题。但这会极大地改变输出文件和大小,我不知道这是否适合您的用例。
无论如何,这是一个完整的工作示例,基于您上面的代码和可验证的 input/output 文件:
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
不幸的是,上传到 Whosebug 将图像转换为 PNG。 TIFF 格式的原始输入和输出文件可以从 Dropbopx.
下载
我正在尝试使用 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图片上加水印?
正如问题的评论中已经指出的那样,问题可能不是您的代码是 "wrong" 或者 TIFF 格式有什么特定的东西可以防止加水印。
但是,TIFF 是一种非常灵活的格式,可以包含从 RGB、CMYK、"deep color" 或浮点样本到简单的索引或二值图像数据的任何内容。我怀疑问题与后者有关(如果是这样,您会遇到与某些调色板 PNG 相同的问题),因为在这些情况下,可能没有颜色可以代表您的透明黑色。但如果没有进一步的澄清,就不可能肯定地说。
通过创建完整的 RGB in-memory 图像,在其上绘制原始图像,然后添加水印,可以轻松解决此类问题。但这会极大地改变输出文件和大小,我不知道这是否适合您的用例。
无论如何,这是一个完整的工作示例,基于您上面的代码和可验证的 input/output 文件:
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
不幸的是,上传到 Whosebug 将图像转换为 PNG。 TIFF 格式的原始输入和输出文件可以从 Dropbopx.
下载