JAI将Alpha通道添加到RenderedImage

时间:2014-11-17 13:33:26

标签: java jai argb

我有两个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);

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

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

下面是图像的示例,因此您可以看到更改颜色的方式:

original Picture

after adding the first overlay

after adding the second overlay

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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;

}

您可能希望确保不修改原始后挡板。