JAVA bitmapToI420

public static byte[] bitmapToI420(Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int[] argb = new int[width * height];
        bitmap.getPixels(argb, 0, width, 0, 0, width, height);

        int ySize = width * height;
        int uvSize = ySize / 4;
        byte[] i420 = new byte[ySize + uvSize * 2]; // Y + U + V

        int yIndex = 0;
        int uIndex = ySize;
        int vIndex = ySize + uvSize;

        // 临时存储 UV 值
        int[][] uTemp = new int[height / 2][width / 2];
        int[][] vTemp = new int[height / 2][width / 2];

        // 第一遍:计算所有 Y 和临时 UV
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int pixel = argb[y * width + x];
                int r = (pixel >> 16) & 0xFF;
                int g = (pixel >> 8) & 0xFF;
                int b = pixel & 0xFF;

                // 计算 YUV
                int yy = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
                int u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
                int v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;

                i420[yIndex++] = (byte) Math.max(0, Math.min(255, yy));

                if (y % 2 == 0 && x % 2 == 0) {
                    uTemp[y / 2][x / 2] = u;
                    vTemp[y / 2][x / 2] = v;
                }
            }
        }

        // 第二遍:填充 U 和 V 平面
        for (int y = 0; y < height / 2; y++) {
            for (int x = 0; x < width / 2; x++) {
                i420[uIndex++] = (byte) Math.max(0, Math.min(255, uTemp[y][x]));
                i420[vIndex++] = (byte) Math.max(0, Math.min(255, vTemp[y][x]));
            }
        }

        return i420;
    }

你可能感兴趣的:(java,算法,开发语言)