Android Camera ImageReader解讀與使用

在講解ImageReader之前,我們先看一段代碼

 /**
     * 初始化圖片讀取器
     */
    private void initImageReader() {
        //創建圖片讀取器,參數爲分辨率寬度和高度/圖片格式/需要緩存幾張圖片,我這裏寫的2意思是獲取2張照片
        mImageReader = ImageReader.newInstance(1080, 1920, ImageFormat.YUV_420_888, 2);
        mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
//        image.acquireLatestImage();//從ImageReader的隊列中獲取最新的image,刪除舊的
//        image.acquireNextImage();//從ImageReader的隊列中獲取下一個圖像,如果返回null沒有新圖像可用
                Image image = reader.acquireNextImage();
                try {
                    File path = new File(Camera2Activity.this.getExternalCacheDir().getPath());
                    if (!path.exists()) {
                        Log.e(TAG, "onImageAvailable: 路徑不存在");
                        path.mkdirs();
                    } else {
                        Log.e(TAG, "onImageAvailable: 路徑存在");
                    }
                    File file = new File(path, "demo.jpg");
                    FileOutputStream fileOutputStream = new FileOutputStream(file);

//        這裏的image.getPlanes()[0]其實是圖層的意思,因爲我的圖片格式是JPEG只有一層所以是geiPlanes()[0],如果你是其他格式(例如png)的圖片會有多個圖層,就可以獲取指定圖層的圖像數據       
                    ByteBuffer byteBuffer = image.getPlanes()[0].getBuffer();
                    byte[] bytes = new byte[byteBuffer.remaining()];
                    byteBuffer.get(bytes);
                    fileOutputStream.write(bytes);
                    fileOutputStream.flush();
                    fileOutputStream.close();
                    image.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }, mChildHandler);
    }

分析上面的代碼:
ImageReader類允許應用程序直接訪問呈現表面的圖像數據
創建ImageReader對像
ImageReader ir = ImageReader.newInstance(int width, int height, int format, int maxImages);
參數:

  1. 默認圖像的寬度像素
  2. 默認圖像的高度像素
  3. 圖像的格式
  4. 用戶想要讀圖像的最大數量

ImageReader類的主要操作:

  • getSurface() //得到一個表面,可用於生產這個ImageReader圖像
  • acquireLatestImage() //從ImageReader的隊列獲得最新的圖像,放棄舊的圖像。
  • acquireNextImage() //從ImageReader的隊列獲取下一個圖像
  • getMaxImages() //最大數量的圖像
  • getWidth() //每個圖像的寬度,以像素爲單位。
  • getHeight() //每個圖像的高度,以像素爲單位。
  • getImageFormat() //圖像格式。
  • close() //釋放與此ImageReader相關的所有資源。用完記得關
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章