相关文章推荐
紧张的树叶  ·  Java AES-256-CBC ...·  1 年前    · 
快乐的板凳  ·  SQL-Inject ...·  1 年前    · 
温柔的汽水  ·  vb.net dictionary ...·  2 年前    · 

android rgb 转 yuv

在 Android 中,你可以使用 android.graphics.ImageFormat 类来处理 RGB 到 YUV 的转换。

RGB 到 YUV 的转换需要使用一个叫做颜色矩阵(ColorMatrix)的对象。这个矩阵将 RGB 颜色空间中的颜色映射到 YUV 颜色空间中的颜色。Android 提供了 android.graphics.ColorMatrix 类,可以用于创建这个矩阵。

下面是一个示例代码,用于将 RGB 格式的图像转换为 YUV 格式:

int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] argb = new int[width * height];
bitmap.getPixels(argb, 0, width, 0, 0, width, height);
byte[] yuv = new byte[width * height * 3 / 2];
ColorMatrix colorMatrix = new ColorMatrix(new float[] {
        0.299f, 0.587f, 0.114f, 0,
        -0.1687f, -0.3313f, 0.5f, 128,
        0.5f, -0.4187f, -0.0813f, 128,
        0, 0, 0, 1
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
for (int i = 0; i < argb.length; i++) {
    int a = (argb[i] >> 24) & 0xff;
    int r = (argb[i] >> 16) & 0xff;
    int g = (argb[i] >> 8) & 0xff;
    int b = argb[i] & 0xff;
    // 应用颜色矩阵
    float[] rgba = {r, g, b, a};
    colorMatrix.mapColor(rgba);
    // RGB 转 YUV
    int y = (int) (0.299f * rgba[0] + 0.587f * rgba[1] + 0.114f * rgba[2]);
    int u = (int) (-0.14713f * rgba[0] - 0.28886f * rgba[1] + 0.436f * rgba[2] + 128);
    int v = (int) (0.615f * rgba[0] - 0.51498f * rgba[1] - 0.10001f * rgba[2] + 128);
    // 转换为 YUV 格式
    yuv[i] = (byte) (Math.max(0, Math.min(y, 255)));
    if (i % 2 == 0) {
        yuv[width * height + (i / 2)] = (byte) (Math.max(0, Math.min(u, 255)));
        yuv[width * height + (i / 2) + 1] = (byte) (Math.max(0, Math.min(v, 255)));

这个示例代码使用 Bitmap.getPixels() 方法获取了 Bitmap 对象的像素数组,然后对每个像素进行 RGB 到 YUV 的转换。转换后的结果保存在一个 byte 数组中。注意,由于 YUV 格式需要更少的存储空

  •