Java JAI将Alpha通道添加到渲染图像

Java JAI将Alpha通道添加到渲染图像,java,jai,argb,Java,Jai,Argb,我有两个渲染图像。我想对这两幅图像执行一个覆盖操作,因此它们需要在数据类型和频带数上匹配。 我的问题是,一幅图像有3个波段(RGB),而第二幅图像有4个波段(ARGB) 我的问题是如何向第一幅图像添加Alpha通道,以便执行覆盖操作 编辑 好的,我找到了一种在第一幅图像中添加Alpha通道的方法。下面是代码。我只是创建了一个单一的带状常量图像,并将其与我的第一个图像合并 ParameterBlock pb = new ParameterBlock(); pb.add(new Float(fina

我有两个
渲染图像
。我想对这两幅图像执行一个
覆盖操作
,因此它们需要在数据类型和频带数上匹配。
我的问题是,一幅图像有3个波段(RGB),而第二幅图像有4个波段(ARGB)

我的问题是如何向第一幅图像添加Alpha通道,以便执行覆盖操作

编辑
好的,我找到了一种在第一幅图像中添加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);
我现在遇到的问题是,每次我添加叠加,图像的颜色都会改变。所有的颜色都变成了红色或粉色的细微差别。当我添加第二个覆盖时,图像再次变为正常,但第一个覆盖会改变颜色。所有黑色区域都变为白色

此外,叠加的背景也是不透明的。它是灰色的

下面是这些图像的示例,您可以看到这些图像是如何改变颜色的:

正如您所看到的,图片和覆盖层会改变颜色,并且覆盖层的背景不是透明的


你能帮我解决这个问题吗,这样图像总是能正确显示?谢谢

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

我不确定类型为\u 4BYTE\u ARGB,因为我通常使用类型为\u INT\u ARGB的BuffereImage,但我经常使用的方法是将RGB BuffereImage绘制为新的ARGB BuffereImage,然后将其绘制到其他对象上而不会出现问题。颜色的变化表明叠加过程中对其他通道进行了不必要的更改,因为它似乎不是特定于特定图像的。如果覆盖操作类似于使用alpha将一个图像绘制到另一个图像上,我可能会建议使用Graphics.drawImage()/drawRenderImage()方法进行覆盖本身,更不用说在这种情况下背景甚至不需要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;

}

但是,您可能希望确保不修改原始背光栅。

是否也不应用参数块?只是将未更改的第一个图像绘制到一个新的干净的BuffereImage中?是的,我创建了一个新的
BuffereImage
,类型为
type\u 4BYTE\u ARGB
,并将第一个图像绘制到其中<代码>img.createGraphics().DrawRenderImage(最终图像,新仿射变换())