NDK - 处理ARGB_8888位图中没有Alpha的RGB值

时间:2016-07-14 20:06:34

标签: java android c++ java-native-interface native

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

1 个答案:

答案 0 :(得分:1)

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

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。关于你的算法:有两种选择 - 代码可以在打包的像素值内部访问各个组件,或者你可以将打包的像素解交织到几个平面,即数组,每个平面只能容纳一个通道。然后在处理之后,您可以将它们再次交错到其中一种支持的格式,或者转换为您感兴趣的其他格式。