【问题标题】:Java: extract Alpha Channel from BufferedImageJava:从 BufferedImage 中提取 Alpha 通道
【发布时间】:2011-05-30 12:56:38
【问题描述】:

我想从缓冲图像中提取 Alpha 通道,并使用灰度将其绘制在单独的图像中。 (就像它在 Photoshop 中显示的一样)

【问题讨论】:

    标签: java alpha


    【解决方案1】:

    未测试,但包含要点。

    public Image alpha2gray(BufferedImage src) {
    
        if (src.getType() != BufferedImage.TYPE_INT_ARGB)
            throw new RuntimeException("Wrong image type.");
    
        int w = src.getWidth();
        int h = src.getHeight();
    
        int[] srcBuffer = src.getData().getPixels(0, 0, w, h, (int[]) null);
        int[] dstBuffer = new int[w * h];
    
        for (int i=0; i<w*h; i++) {
            int a = (srcBuffer[i] >> 24) & 0xff;
            dstBuffer[i] = a | a << 8 | a << 16;
        }
    
        return Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(w, h, pix, 0, w));
    }
    

    【讨论】:

    • 我认为作业的转变需要另辟蹊径? a | a &lt;&lt; 8 | a &lt;&lt; 16
    • 这不会编译。要修复的行:int[] srcBuffer = src.getData().getPixels(0, 0, w, h, (int[]) null);
    • @vbence 我不知道我可以编辑它,谢谢。我看到你自己编辑的
    【解决方案2】:

    我不相信有一个方法调用可以做到这一点;您必须获取所有图像数据并屏蔽每个像素的 alpha 字节。例如,使用getRGB() 来获取图像的 ARGB 像素。最高有效字节是 alpha 值。所以对于你从getRGB()得到的数组中的每个像素,

    int alpha = (pixel >> 24) & 0xFF; 
    

    【讨论】:

    • 好的,谢谢。我将如何从一个像素中屏蔽掉 alpha 字节?
    • 我认为这是可能的,无需手动循环像素,这可能会在某些平台上产生更好的性能,请参阅我的答案。
    【解决方案3】:

    您可以从 BufferedImage 中 grab the Raster,然后 create a child 这个仅包含您感兴趣的波段的栅格(bandList 参数)。从此子栅格中,您可以使用合适的 ColorModel 创建一个 new BufferedImage,它只包含灰度 aplpha 蒙版。

    这样做而不是手动迭代像素的好处是运行时有机会了解您在做什么,因此可能可以通过利用硬件来加速能力。老实说,我怀疑当前的 JVM 会加速它,但谁知道未来会发生什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 2010-09-18
      • 2013-02-07
      • 2013-05-17
      • 2010-09-24
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多