Android 图片格式转换

  1. Camera2获取帧数据ImageReader转换YUV

Image image = reader.acquireLatestImage();
public byte[] YUV_420_888toNV21(Image image) {
        byte[] data = null;
        ByteBuffer buffer;
        if (image.getFormat() == ImageFormat.YUV_420_888) {
            Image.Plane[] planes = image.getPlanes();
            buffer = planes[0].getBuffer();//Y通道
            if (data == null) {
                data = new byte[buffer.capacity() * 3 / 2];
            }
            //planes[1]和planes[2]根据摄像头上传数据判断U或者V
            int len = buffer.capacity();
            buffer.get(data, 0, len);
            buffer = planes[1].getBuffer();
            int len1 = buffer.capacity();
            buffer.get(data, len, len1);
            buffer = planes[2].getBuffer();
            int len2 = buffer.capacity();
            buffer.get(data, len+len1, len2);
            buffer.clear();
        }
        return data;
    }
  1. RGB24转Bitmap,发现Bitmap只支持ALPHA_8,RGB_565(RGB16),ARGB_4444,ARGB_8888,RGBA_F16

int[] img = ICVPUtil.convertByteToColor(imgByte);
Bitmap bitmap = Bitmap.createBitmap(img,imgWidth, imgHeight, Bitmap.Config.ARGB_8888); 
public static int[] convertByteToColor(byte[] data) {
        int size = data.length;
        if (size == 0) {
            return null;
        }

        int arg = 0;
        if (size % 3 != 0) {
            arg = 1;
        }

        // 一般RGB字节数组的长度应该是3的倍数,
        // 不排除有特殊情况,多余的RGB数据用黑色0XFF000000填充
        int[] color = new int[size / 3 + arg];
        int red, green, blue;
        int colorLen = color.length;
        if (arg == 0) {
            for (int i = 0; i < colorLen; ++i) {
                red = convertByteToInt(data[i * 3]);
                green = convertByteToInt(data[i * 3 + 1]);
                blue = convertByteToInt(data[i * 3 + 2]);

                // 获取RGB分量值通过按位或生成int的像素值
                color[i] = (red << 16) | (green << 8) | blue | 0xFF000000;
            }
        } else {
            for (int i = 0; i < colorLen - 1; ++i) {
                red = convertByteToInt(data[i * 3]);
                green = convertByteToInt(data[i * 3 + 1]);
                blue = convertByteToInt(data[i * 3 + 2]);
                color[i] = (red << 16) | (green << 8) | blue | 0xFF000000;
            }

            color[colorLen - 1] = 0xFF000000;
        }

        return color;
    }
    // 将一个byte数转成int
    // 实现这个函数的目的是为了将byte数当成无符号的变量去转化成int
    public static int convertByteToInt(byte data) {

        int heightBit = (int) ((data >> 4) & 0x0F);
        int lowBit = (int) (0x0F & data);
        return heightBit * 16 + lowBit;
    }
  1. OpenCV转换图片格式

Mat frameMat = new Mat(imgHeight, imgWidth, CvType.CV_8UC3);//3通道RGB
Mat frameMat = new Mat(imgHeight* 3 / 2, imgWidth, CvType.CV_8UC1);//YUV
Mat grayMat = new Mat(imgHeight, imgWidth, CvType.CV_8UC1);//灰度图
frameMat.put(0, 0, imageData);
Mat mat1 = new Mat();
Imgproc.cvtColor(frameMat, mat1, Imgproc.COLOR_YUV2RGB_NV12, 3);
frameMat.release();//格式转换
Imgproc.rectangle(mat1, rect, faceRectScalar, 2);//绘制图形
Mat flipMat = new Mat();
Core.flip(mat1, flipMat, 1);//镜像翻转
Core.rotate(rgbMat,rgbMat,Core.ROTATE_90_COUNTERCLOCKWISE);//90度旋转
Bitmap bitmap = Bitmap.createBitmap(imgWidth, imgHeight, Bitmap.Config.RGB_565);
Utils.matToBitmap(flipMat, bitmap);//转换Bitmap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值