0

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

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

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

根据这个线程: 对RGB值使用逻辑位移

 (pixelValue >>24 & 0xff);

不等于

Color.alpha(pixelValue);

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

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

  • 4位无alpha
  • 4 位 + 4 位阿尔法
  • 24 位,包括 alpha (?)
  • Macintosh 提供 24 位加(或包括?) 8 位 alpha

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

任何帮助表示赞赏,谢谢。

4

1 回答 1

0
  1. 首先,如果你担心性能,你应该实施它并衡量它。

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

  3. 另一方面,假设您将位图加载为Bitmap类实例,则只有 4 种可能的像素格式,并且ARGB_8888可能是您应该关心的唯一一种(也许RGB_565也是,但我不希望有这么小的模糊效果比特/像素值)。ARGB_8888实际上,根据BitmapFactory.Options文档,位图默认加载配置。换句话说 - 使用标准 Android 的位图处理 API,您不需要进行任何转换,它为您完成 - 只需指定您需要的格式。

  4. 事实上(pixelValue >>24 & 0xff);和像素格式Color.alpha(pixelValue);是等价的ARGB_8888,但是它可以做得更好。

使用逻辑移位运算符(相对于>>算术移位),您根本不需要& 0xFF运算,因为位 31..8 始终为 0。请参阅如何Color.alpha()实现:

public static int alpha(int color) {
    return color >>> 24;
}
于 2012-11-12T14:07:44.217 回答