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();
    }
}
相关推荐
Predestination王瀞潞7 分钟前
Java EE开发技术(Servlet整合JDBC银行管理系统-上)
java·servlet·java-ee·jdbc
寻星探路9 分钟前
Java EE初阶启程记13---JUC(java.util.concurrent) 的常见类
java·开发语言·java-ee
怪兽20141 小时前
什么是 Redis?
java·数据库·redis·缓存·面试
Gu_yyqx1 小时前
Java 队列
java
落日漫游1 小时前
数据结构笔试核心考点
java·开发语言·算法
疯狂吧小飞牛1 小时前
Lua C API 中的注册表介绍
java·c语言·lua
kyle~1 小时前
C++--- override 关键字 强制编译器验证当前函数是否重写基类的虚函数
java·前端·c++
Hello.Reader2 小时前
Flink 受管状态的自定义序列化原理、实践与可演进设计
java·网络·flink
Light602 小时前
像素退场,曲线登场:现代响应式 CSS 全家桶 | 领码课堂
前端·css·响应式设计·css函数·布局系统·相对单位·设计令牌
让我上个超影吧2 小时前
设计模式【工厂模式和策略模式】
java·设计模式·策略模式