在捕获图像相机时会在Redmi Note7的camera2 API Android中冻结

在下面的代码中,我刚刚读取图像并将其保存到图库中。

            public void onImageAvailable(ImageReader reader) {
                Image image = null;
                try {
                    image = reader.acquireLatestImage();
                    buffer = image.getPlanes()[0].getBuffer();
                    bytes = new byte[buffer.capacity()];
                    buffer.get(bytes);
                    save(bytes);

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                } finally {
                    if (image != null) {
                        image.close();
                    }
                }

private void save(byte [] bytes)引发IOException {

                if (!myDir.exists()) {
                    myDir.mkdirs();
                }

                Random generator = new Random();
                int n = 10000;
                n = generator.nextInt(n);
                String fname = "Image-" + n + ".png";

                File file = new File(myDir,fname);

                if (file.exists()) file.delete();



                OutputStream output = null;
                try {
                    output = new FileOutputStream(file);
                    output.write(bytes);
                    scanFile(file.getabsolutePath());

//最终int旋转= getImageOrientation(file.getabsolutePath());

                } finally {
                    if (null != output) {
                        output.close();
                    }
                }
            }
q247877488 回答:在捕获图像相机时会在Redmi Note7的camera2 API Android中冻结

我的猜测是,您在每次操作完成之前都关闭了Image。首先让您的图片像:

private ImageReader mImageReader;
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new
        ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {

                if(count==0) {
                    mBackgroundHandler.post(new ImageSaver(reader.acquireLatestImage()));
                    ++count;
                }
            }
        };

之后,您可以在单独的线程中执行您想做的事情:

private class ImageSaver implements Runnable {

    private final Image mImage;

    public ImageSaver(Image image) {
        mImage = image;
    }

    @Override
    public void run() {


        //Do what you want to do here and close your Image after that. Code here!!

        mImage.close();
        --count;
    }
}

我使用int ++ count --count来控制流。

本文链接:https://www.f2er.com/3139437.html

大家都在问