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();
    }
}
相关推荐
AI多Agent协作实战派4 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit4 小时前
Java+Ai+vue
java·spring·maven
qq_2518364574 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
LayZhangStrive4 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
未秃头的程序猿4 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程
曹牧5 小时前
Eclipse 批量文本替换
java·ide·eclipse
an317425 小时前
6MB 组织树大文件性能优化全流程
前端·javascript·vue.js
程序员清风5 小时前
OpenAI官方发布最新提示词技巧!
java·后端·面试
梅头脑5 小时前
写了3年CRUD,volatile和synchronized的区别还是答不清——直到我画出了这张三性两锁边界图
java
暮暮祈安5 小时前
Celery 新手入门指南
java·数据库·python·flask·httpx