【发布时间】:2016-08-24 03:11:47
【问题描述】:
我正在尝试使用 Java 高级成像 (JAI) 从 BufferedImage 编写 TIFF,但不确定如何使其透明。以下方法可用于使 PNG 和 GIF 透明:
private static BufferedImage makeTransparent(BufferedImage image, int x, int y) {
ColorModel cm = image.getColorModel();
if (!(cm instanceof IndexColorModel)) {
return image;
}
IndexColorModel icm = (IndexColorModel) cm;
WritableRaster raster = image.getRaster();
int pixel = raster.getSample(x, y, 0);
// pixel is offset in ICM's palette
int size = icm.getMapSize();
byte[] reds = new byte[size];
byte[] greens = new byte[size];
byte[] blues = new byte[size];
icm.getReds(reds);
icm.getGreens(greens);
icm.getBlues(blues);
IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues, pixel);
return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null);
}
但是在编写 TIFF 时,背景总是白色的。以下是我用于编写 TIFF 的代码:
BufferedImage destination = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
Graphics imageGraphics = destination.getGraphics();
imageGraphics.drawImage(sourceImage, 0, 0, backgroundColor, null);
if (isTransparent) {
destination = makeTransparent(destination, 0, 0);
}
destination.createGraphics().drawImage(sourceImage, 0, 0, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
TIFFImageWriter writer = new TIFFImageWriter(new TIFFImageWriterSpi());
writer.setOutput(ios);
writer.write(destination);
我稍后也会进行一些元数据操作,因为我实际上是在处理 GeoTIFF。但此时图像仍然是白色的。调试时,我可以查看BufferedImage,它是透明的,但是当我写图像时,文件有白色背景。我需要对 TiffImageWriteParam 做一些特定的事情吗?感谢您提供的任何帮助。
【问题讨论】:
-
从我目前所做的研究来看,他们似乎确实如此。我也有透明 tif 的例子
-
Hmmm.. 为什么要将源绘制到目标两次(并在此过程中创建两个
Graphics上下文)?
标签: java image transparent tiff jai