2014-11-17 83 views
3

我有两个RenderedImages。我想用这两幅图像做一个Overlay Operation,因此它们需要匹配数据类型和波段数。
我的问题是一个图像有3个波段(RGB),第二个图像有4个波段(ARGB)。JAI将Alpha通道添加到RenderedImage

我的问题是如何添加一个Alpha通道到第一个图像,所以我可以做Overlay Operation

EDIT
好的,我发现添加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

正如你可以看到,图片和叠加改变颜色和叠加的背景不透明。

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

回答

0

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

+0

这没有奏效。图像不断变化的颜色。 – adryr

+0

也没有应用你的参数块?只需将未改变的第一张图像绘制成新的干净的缓冲图像? – cello

+0

是的,我创建了一个'TYPE_4BYTE_ARGB'类型的'BufferedImage',并在其中绘制了第一个图像。 'img.createGraphics()。drawRenderedImage(finalImage,new AffineTransform());' – adryr

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; 

} 

您可能希望确保将原先光栅并不虽然修改。