Android ARGB_8888 转 RGB

Posted

技术标签:

【中文标题】Android ARGB_8888 转 RGB【英文标题】:Android ARGB_8888 to RGB 【发布时间】:2021-09-18 01:10:14 【问题描述】:

我正在使用cameraX 来分析来自相机的图像。

我得到了 YUV_420_888 格式的图像,并设法将其转换为 ARGB_8888

我需要每个像素都在 3 个字节上,精度为 8 位,值从 0...255

这就是我创建位图的方式。

val bitmap = Bitmap.createBitmap(image.width, image.height, Bitmap.Config.ARGB_8888)

有没有办法从 ARGB_8888 中删除 Alpha 通道?

【问题讨论】:

也许可以尝试使用如下渲染脚本直接从 YUV 转换为 RGB:github.com/pinguo-yuyidong/Camera2/blob/master/camera2/src/main/… 或者这里有官方的YuvToRgbConverter util:github.com/android/camera-samples/blob/… @Orcun 我已经使用了那个转换器,但我不需要 Alpha。我在 Tensor Flow 中有一个模型需要 RGB 图像,而不是 ARGB 【参考方案1】:

有多种方法可以做到这一点,我认为使用 OpenCV 可能会更有效/更快。 这是Java方式:

public byte[] getImagePixels(Bitmap image) 
// calculate how many bytes our image consists of
int bytes = image.getByteCount();

ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new buffer
image.copyPixelsToBuffer(buffer); // Move the byte data to the buffer

byte[] temp = buffer.array(); // Get the underlying array containing the data.

byte[] pixels = new byte[(temp.length / 4) * 3]; // Allocate for 3 byte BGR

// Copy pixels into place
for (int i = 0; i < (temp.length / 4); i++) 
    pixels[i * 3] = temp[i * 4 + 2]; // B 
    pixels[i * 3 + 1] = temp[i * 4 + 1]; // G 
    pixels[i * 3 + 2] = temp[i * 4 + 0]; //R

   // Alpha is discarded


return pixels;

【讨论】:

以上是关于Android ARGB_8888 转 RGB的主要内容,如果未能解决你的问题,请参考以下文章

ALPHA_8ARGB_4444ARGB_8888RGB_565等图片格式的使用

我无法让 vImage(加速框架)将 420Yp8_Cb8_Cr8(平面)转换为 ARGB8888

Android中处理大图片时图片压缩

Android Bitmap转I420的坑,以及图文详解YUV420数据格式

使用 vImageScale_ARGB8888 缩放图像时图像质量受到影响 - Cocoa Objective C

Android 必知必会 - RGBA转ARGB