3

我有两个RenderedImages。我想Overlay Operation对这两个图像进行处理,因此它们需要匹配数据类型和波段数。
我遇到的问题是一张图像有 3 个波段(RGB),而第二张图像有 4 个波段(ARGB)。

我的问题是如何将 Alpha 通道添加到第一张图像以便我可以做到Overlay Operation

编辑
好的,我找到了一种将 Alpha 通道添加到第一张图像的方法。下面是代码。我只是创建了一个带状常量图像并将其与我的第一个图像合并。

ParameterBlock pb = new ParameterBlock();
pb.add(new Float(finalImage.getWidth())).add(new Float(finalImage.getHeight()));
pb.add(new Byte[] {new Byte((byte)0xFF)});
RenderedImage alpha = JAI.create("constant", pb);

finalImage = BandMergeDescriptor.create(finalImage, alpha, null);

我现在遇到的问题是,每次添加叠加层时,图像都会改变颜色。所有颜色都变成红色或粉红色的细微差别。当我添加第二个叠加层时,图像再次变得正常,但第一个叠加层改变了颜色。所有黑色区域都变为白色。

叠加层的背景也不透明。它是灰色的。

以下是图像示例,因此您可以看到颜色如何变化:

原图

添加第一个叠加层后

添加第二个叠加层后

如您所见,图片和叠加层改变了颜色,并且叠加层的背景不透明。

你能帮我解决这个问题,让图像始终正确显示吗?谢谢!

4

2 回答 2

0

您可以尝试使用 ARGB 模型创建一个新的 BufferedImage,然后将不透明的背景图片绘制到这个新的 BufferedImage 中。然后你有一个带有 alpha 通道的 BufferedImage(尽管所有像素都是不透明的),所以合成应该可以工作。

于 2014-11-18T08:54:07.857 回答
0

我不确定 TYPE_4BYTE_ARGB 因为我通常使用 TYPE_INT_ARGB 的 BufferedImages 但我经常使用将 RGB BufferedImage 绘制到新的 ARGB BufferedImage 然后将其绘制到其他东西上的方法没有问题。颜色的变化表明在叠加过程中对其他通道进行了不必要的更改,因为它似乎并不特定于特定图像。如果您的叠加操作类似于使用 alpha 将一个图像绘制到另一个图像上,我可能会建议对叠加层本身使用 Graphics.drawImage()/drawRenderedImage() 方法,更不用说在这种情况下背景甚至不需要 alpha。

编码:

public RenderedImage overlay(RenderedImage back, RenderedImage front, AffineTransform overlayTransformation)
{

    BufferedImage newBack = new BufferedImage(back.getWidth(), back.getHeight(), TYPE_3BYTE_RGB);
    newBack.setData(back.getData());
    Graphics2D graphics = (Graphics2D)(newBack.getGraphics());
    graphics.drawRenderedImage(front, overlayTransformation);
    return newBack;

}

您可能希望确保原始的背面 Raster 未被修改。

于 2015-11-22T04:20:25.897 回答