You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 12:12:02