NDK - 从ARGB_8888位图中处理不带 Alpha 的 RGB 值



>我有一个处理算法,如果我单独处理每个颜色通道,它的性能会很好。 但是当我尝试处理整个像素值时,事情就错过了。 结果不好。 现在我想将 3 色通道与像素值(不包括 alpha)隔离,然后处理新值(3 个通道)。如何在C++中做到这一点?知道我尝试了RGB_565位图格式,这不是一个好的解决方案。并且知道我想将 RGB 合并为 24 位变量。

您可以单独访问每个频道。确切的方式取决于实际的像素格式。

ANDROID_BITMAP_FORMAT_RGBA_8888:每个像素长4字节,布局模式为RGBARGBA...,即第1个像素字节是红色分量,2-d是绿色,3-d是蓝色,第4个是alpha分量。

ANDROID_BITMAP_FORMAT_RGB_565 :每个像素的长度为 2 字节,以原生字节序存储,因此可以通过以下方式提取颜色分量:

red   = (u16_pix >> 11) & 0x1f;
green = (u16_pix >>  5) & 0x3f;
blue  = (u16_pix >>  0) & 0x1f;

ANDROID_BITMAP_FORMAT_RGBA_4444 : 由于质量差而被弃用,您甚至不应该考虑这个

ANDROID_BITMAP_FORMAT_A_8 : 为每像素 1 个字节,专为仅 Alpha 或灰度图像而设计。这可能不是您要找的。

请注意,Android 没有 24bpp 格式,您必须选择 32bpp 或 16bpp 格式。关于你的算法:有两种选择 - 代码可以直接访问打包像素值内的单个组件,或者您可以将打包像素解交错为几个平面,即数组,每个平面只包含一个通道。然后,在处理之后,您可以将它们再次交错为支持的格式之一或转换为您感兴趣的其他格式。

最新更新