【问题标题】:JAI Add Alpha Channel to RenderedImageJAI 将 Alpha 通道添加到 RenderedImage
【发布时间】:2014-11-17 13:33:25
【问题描述】:

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

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

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

以下是图片示例,让您了解颜色如何变化:

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

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

【问题讨论】:

    标签: java jai argb


    【解决方案1】:

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

    【讨论】:

    • 也没有应用你的参数块?只是将您未更改的第一张图像绘制成一个新的干净的缓冲图像?
    • 是的,我创建了一个新的BufferedImage,类型为TYPE_4BYTE_ARGB,并在其中绘制了第一张图片。 img.createGraphics().drawRenderedImage(finalImage, new AffineTransform());
    【解决方案2】:

    我不确定 TYPE_4BYTE_ARGB,因为我通常使用 TYPE_INT_ARGB 的 BufferedImage,但我经常使用将 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 未被修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多