ImageReader保存图片转 opencvmat

目录

[ImageReader 直接保存图片,没成功,格式是yuv420,需要转换](#ImageReader 直接保存图片,没成功,格式是yuv420,需要转换)

转opencv

nv21保存图片,测试ok

[rgb888 data保存图片:](#rgb888 data保存图片:)


ImageReader 直接保存图片,没成功,格式是yuv420,需要转换

java 复制代码
// 创建一个ImageReader对象
ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);

reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image image = null;
        try {
            image = reader.acquireLatestImage();
            if (image != null) {
                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                byte[] bytes = new byte[buffer.capacity()];
                buffer.get(bytes);
                saveImage(bytes);
            }
        } finally {
            if (image != null) {
                image.close();
            }
        }
    }
}, handler);

// 保存图片
private void saveImage(byte[] bytes) {
    File file = new File(Environment.getExternalStorageDirectory() + "/picture.jpg");
    FileOutputStream output = null;
    try {
        output = new FileOutputStream(file);
        output.write(bytes);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (null != output) {
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

转opencv

java 复制代码
Image image = imageReader.acquireLatestImage();
Plane[] planes = image.getPlanes();
ByteBuffer bufferY = planes[0].getBuffer();
ByteBuffer bufferU = planes[1].getBuffer();
ByteBuffer bufferV = planes[2].getBuffer();
byte[] bytesY = new byte[bufferY.remaining()];
byte[] bytesU = new byte[bufferU.remaining()];
byte[] bytesV = new byte[bufferV.remaining()];
bufferY.get(bytesY);
bufferU.get(bytesU);
bufferV.get(bytesV);

c++部分:

cpp 复制代码
cv::Mat imgY(height, width, CV_8UC1, bytesY);
cv::Mat imgU(height, width, CV_8UC1, bytesU);
cv::Mat imgV(height, width, CV_8UC1, bytesV);

c++部分:

cpp 复制代码
cv::Mat imgYUV;
cv::merge(std::vector<cv::Mat>{imgY, imgU, imgV}, imgYUV);
cv::Mat imgRGB;
cv::cvtColor(imgYUV, imgRGB, cv::COLOR_YUV2RGB);

nv21保存图片,测试ok

java 复制代码
     Yuv2Rgb.nativeNV21ToARGB8888(nv21, data, width[0], height[0]);
                        long t2 = System.currentTimeMillis();

                        // 假设你已经有了一个ARGB_8888格式的图像,存储在一个名为pixels的int数组中
                        int width = 1920;
                        int height = 1080;

                        String file_name="/storage/emulated/0/Android/data/com.sandstar.jupiter.terminal.algor/files/"+mCameraId+"/"+frameIdx+"_b.jpg";
                        YuvImage yuvImage = new YuvImage(nv21, ImageFormat.NV21, width, height, null);

                        try {
                        // 创建一个输出流来保存图片
                        FileOutputStream outStream = new FileOutputStream(file_name);

                        // 将YuvImage转换为JPEG,并保存到输出流中
                        yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, outStream);

                        // 关闭输出流
                        outStream.close();
                         } catch (IOException e) {
                            e.printStackTrace();
                        }

rgb888 data保存图片:

java 复制代码
Yuv2Rgb.nativeNV21ToARGB8888(nv21, data, width[0], height[0]); 

// Create a Bitmap from the ARGB8888 data
Bitmap bitmap = Bitmap.createBitmap(data, width[0], height[0], Bitmap.Config.ARGB_8888);

// Save the Bitmap as a JPEG file
FileOutputStream fos = null;
try {
    fos = new FileOutputStream("/path/to/your/file.jpg");
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (fos != null) {
            fos.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
相关推荐
墨渊君6 分钟前
React Native 跨平台组件库实践: GlueStack UI 上手指南
前端
晓得迷路了14 分钟前
栗子前端技术周刊第 84 期 - Vite v7.0 beta、Vitest 3.2、Astro 5.9...
前端·javascript·vite
独立开阀者_FwtCoder17 分钟前
最全301/302重定向指南:从SEO到实战,一篇就够了
前端·javascript·vue.js
pan_junbiao25 分钟前
Spring框架的设计模式
java·spring·设计模式
远方160925 分钟前
0x-2-Oracle Linux 9上安装JDK配置环境变量
java·linux·oracle
Moment26 分钟前
给大家推荐一个超好用的 Marsview 低代码平台 🤩🤩🤩
前端·javascript·github
小满zs30 分钟前
Zustand 第三章(状态简化)
前端·react.js
北执南念31 分钟前
CompletableFuture+线程池使用案列
java
普宁彭于晏32 分钟前
元素水平垂直居中的方法
前端·css·笔记·css3
恋猫de小郭43 分钟前
为什么跨平台框架可以适配鸿蒙,它们的技术原理是什么?
android·前端·flutter