在講解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);
參數:
- 默認圖像的寬度像素
- 默認圖像的高度像素
- 圖像的格式
- 用戶想要讀圖像的最大數量
ImageReader類的主要操作:
- getSurface() //得到一個表面,可用於生產這個ImageReader圖像
- acquireLatestImage() //從ImageReader的隊列獲得最新的圖像,放棄舊的圖像。
- acquireNextImage() //從ImageReader的隊列獲取下一個圖像
- getMaxImages() //最大數量的圖像
- getWidth() //每個圖像的寬度,以像素爲單位。
- getHeight() //每個圖像的高度,以像素爲單位。
- getImageFormat() //圖像格式。
- close() //釋放與此ImageReader相關的所有資源。用完記得關