2

作为使用API捕获的结果,我得到了Image格式。我需要将图像转换为 RGB 格式,但是生成的图像的颜色是错误的。YUV_420_888Camera2

在此处输入图像描述

这是使用 OpenCV 执行转换的函数:

@TargetApi(Build.VERSION_CODES.KITKAT)
    public static Bitmap createBitmapFromYUV420(Image image) {
        Image.Plane[] planes = image.getPlanes();

        byte[] imageData = new byte[image.getWidth() * image.getHeight() * ImageFormat.getBitsPerPixel(ImageFormat.YUV_420_888) / 8];

        ByteBuffer buffer = planes[0].getBuffer();
        int lastIndex = buffer.remaining();
        buffer.get(imageData, 0, lastIndex);
        int pixelStride = planes[1].getPixelStride();

        for (int i = 1; i < planes.length; i++) {
            buffer = planes[i].getBuffer();
            byte[] planeData = new byte[buffer.remaining()];
            buffer.get(planeData);

            for (int j = 0; j < planeData.length; j += pixelStride) {
                imageData[lastIndex++] = planeData[j];
            }
        }

        Mat yuvMat = new Mat(image.getHeight() + image.getHeight() / 2, image.getWidth(), CvType.CV_8UC1);
        yuvMat.put(0, 0, imageData);

        Mat rgbMat = new Mat();
        Imgproc.cvtColor(yuvMat, rgbMat, Imgproc.COLOR_YUV420p2RGBA);

        Bitmap bitmap = Bitmap.createBitmap(rgbMat.cols(), rgbMat.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(rgbMat, bitmap);

        return bitmap;
    }

我认为将来自 3 个平面的字节附加到字节数组中的方式是正确的,所以错误可能在其他地方?


解决了

显然,Android API 21 中存在一个错误,导致 U 和 V 数组除了几个字节外全为 0,从而导致图像为绿色。API 22 已修复此问题。

4

0 回答 0