在 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 格式需要更少的存储空