使高斯滤波器对可变颜色深度具有鲁棒性

时间:2012-11-05 12:11:01

标签: android converter rgb gaussian

我正在为android编写一个高斯过滤器。

根据本教程的GaussFilter示例:http://www.jhlabs.com/ip/blurring.html我正在编辑我的ALPHA值

alpha += f * ((pixelValue >> 24) & 0xff);

根据这篇主题: Using logical bitshift for RGB values

 (pixelValue >>24 & 0xff);

不等于

Color.alpha(pixelValue);

据我所知,alpha通道在RGB中是可选的。 所以这取决于我如何阅读和编辑alpha和rgb vlaues的深度。

有许多不同颜色深度的组合,例如:

  • 4 bit no alpha
  • 4 bit + 4 bit alpha
  • 24位,包括alpha(?)
  • Macintosh提供24位加(或包括?)8位alpha

由于我不知道用户想要处理哪种类型的图像,因此我必须捕获所有组合。我只是使用Color.Red(值),Color.Green(值)......但我不确定这到底是否会太慢?我可以在处理之前将每个输入转换为24位位图,但这需要太长时间。

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 首先,如果您担心表现,您应该实施并衡量。

  2. 如果您希望尽可能快地实现,那么您几乎必须针对每种像素格式进行专门化。但很可能你只需要处理一个,见下文。

  3. 另一方面,假设您将位图加载为Bitmap类实例,只有4种可能的像素格式,ARGB_8888可能是您应该关注的唯一一种(也许RGB_565也是如此,但我不希望这么小的每像素位值产生漂亮的模糊效果。实际上,根据BitmapFactory.Options文档,默认情况下,位图会加载ARGB_8888配置。换句话说 - 使用标准的Android位图处理API,您无需进行任何转换,只需指定您需要的格式即可。

  4. 事实上,(pixelValue >>24 & 0xff);Color.alpha(pixelValue);ARGB_8888像素格式相同,但可以做得更好。

  5. 使用逻辑移位运算符(与>>相反,算术移位)根本不需要& 0xFF运算,因为位31..8始终为0.请参阅Color.alpha()实施:

    public static int alpha(int color) {
        return color >>> 24;
    }