我正在为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的深度。
有许多不同颜色深度的组合,例如:
由于我不知道用户想要处理哪种类型的图像,因此我必须捕获所有组合。我只是使用Color.Red(值),Color.Green(值)......但我不确定这到底是否会太慢?我可以在处理之前将每个输入转换为24位位图,但这需要太长时间。
感谢任何帮助,谢谢。
答案 0 :(得分:0)
首先,如果您担心表现,您应该实施并衡量。
如果您希望尽可能快地实现,那么您几乎必须针对每种像素格式进行专门化。但很可能你只需要处理一个,见下文。
另一方面,假设您将位图加载为Bitmap类实例,只有4种可能的像素格式,ARGB_8888
可能是您应该关注的唯一一种(也许RGB_565
也是如此,但我不希望这么小的每像素位值产生漂亮的模糊效果。实际上,根据BitmapFactory.Options文档,默认情况下,位图会加载ARGB_8888
配置。换句话说 - 使用标准的Android位图处理API,您无需进行任何转换,只需指定您需要的格式即可。
事实上,(pixelValue >>24 & 0xff);
和Color.alpha(pixelValue);
与ARGB_8888
像素格式相同,但可以做得更好。
使用逻辑移位运算符(与>>
相反,算术移位)根本不需要& 0xFF
运算,因为位31..8始终为0.请参阅Color.alpha()
实施:
public static int alpha(int color) {
return color >>> 24;
}