NDK - 从 ARGB_8888 位图中处理没有 Alpha 的 RGB 值
NDK - process RGB value without Alpha from an ARGB_8888 bitmap
我有一个处理算法,如果我分别处理每个颜色通道,它的性能会很好。但是当我试图处理整个像素值时,事情就错过了。结果不好。现在我想从像素值(不包括 alpha)中分离出 3 个颜色通道,然后处理新值(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的格式。关于您的算法:有两种选择 - 代码可以访问打包像素值内的各个组件,或者您可以将打包像素解交错到几个平面,即数组,每个平面将只包含一个通道。然后在处理之后,您可以将它们再次交错为一种受支持的格式或转换为您感兴趣的其他格式。
我有一个处理算法,如果我分别处理每个颜色通道,它的性能会很好。但是当我试图处理整个像素值时,事情就错过了。结果不好。现在我想从像素值(不包括 alpha)中分离出 3 个颜色通道,然后处理新值(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的格式。关于您的算法:有两种选择 - 代码可以访问打包像素值内的各个组件,或者您可以将打包像素解交错到几个平面,即数组,每个平面将只包含一个通道。然后在处理之后,您可以将它们再次交错为一种受支持的格式或转换为您感兴趣的其他格式。