Android中CameraX生成的ARGB_8888位图如何去除Alpha通道转为RGB
移除ARGB_8888位图Alpha通道获取3字节RGB数据的实现方法
Android系统内置的Bitmap.Config没有3字节每像素的原生RGB配置,你可以通过以下两种常用方案获取符合要求的原始RGB数据:
方案1:Kotlin/Java层直接遍历提取(适合中小分辨率场景,逻辑简单易维护)
实现逻辑为直接读取ARGB_8888位图的每个像素值,忽略Alpha通道后单独提取R、G、B三个通道的8位值存入字节数组即可,示例代码如下:
// 输入为你已创建的ARGB_8888格式bitmap val pixelTotal = bitmap.width * bitmap.height // 存储所有像素的Int数组,每个Int对应一个ARGB像素 val argbPixels = IntArray(pixelTotal) bitmap.getPixels(argbPixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height) // 输出的RGB字节数组,每个像素占3字节,顺序为R-G-B val rgbRawData = ByteArray(pixelTotal * 3) var writePos = 0 for (pixel in argbPixels) { // 按位运算提取对应通道值,范围0~255,直接丢弃Alpha通道 val red = (pixel shr 16) and 0xFF val green = (pixel shr 8) and 0xFF val blue = pixel and 0xFF rgbRawData[writePos++] = red.toByte() rgbRawData[writePos++] = green.toByte() rgbRawData[writePos++] = blue.toByte() }
注意:如果你的下游逻辑需要BGR顺序,调换三个通道的写入顺序即可。
方案2:Native层内存拷贝(适合高分辨率大帧场景,性能更高)
如果处理的是1080P以上的高帧率相机帧,Java层遍历会有明显性能损耗,建议把Bitmap传到Native层处理:
- 通过NDK的
AndroidBitmap_lockPixels接口获取Bitmap的像素内存首地址 - 按4字节为单位读取每个ARGB像素,跳过Alpha通道后直接拷贝R、G、B值到输出内存即可
注意:需要确认设备的字节序,避免出现通道顺序错乱的问题
内容的提问来源于stack exchange,提问作者Marian Pavel
相关产品推荐
相关产品推荐

