2016-01-24 23 views
0

我正在嘗試從相機中獲取像素的rgb值。在Android中查找camera2 API位圖的RGB值

我不斷收到空值。 是否有另一種方法將圖像從相機捕獲到位圖中?我看了幾個選項,但其中大多數產生了NullPointerException。

它還輸出SkImageDecoder :: Factory返回null。

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { 

@Override 
public void onImageAvailable(ImageReader reader) { 
    //   Image image = reader.acquireNextImage(); 
    //   mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile)); 

    try { 
     Image image = reader.acquireNextImage(); 
     final Image.Plane[] planes = image.getPlanes(); 
     final Buffer buffer = planes[0].getBuffer(); 
     Log.d("BUFFER", String.valueOf(buffer)); 
     int offset = 0; 
     //  
     byte[] bytes = new byte[buffer.remaining()]; 
     Log.d("BUYTES", String.valueOf(bytes)); 
     //    
     Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); // NULL err 
     Log.d("R1", "bitmap created"); 
     //    
     int r1, g1, b1; 
     int p = 50; 
     r1 = (p >> 16) & 0xff; 
     g1 = (p >> 8) & 0xff; 
     b1 = p & 0xff; 
     Log.d("R1", String.valueOf(r1)); 
     Log.d("G1", String.valueOf(g1)); 
     Log.d("B1", String.valueOf(b1)); 
    } catch (Exception e) { 
     e.printStackTrace(); 

    } 
} 

};

回答

1

您的ImageReader使用什麼格式?如果它是JPEG,那麼你的方法通常應該可以工作,但實際上並不是在任何地方將緩衝區複製到字節中。

您正在創建bytes數組,然後將該空數組傳遞給decodeByteArray。你需要像ByteBuffer.get這樣的東西將數據實際複製到字節中。

如果ImageReader是YUV或RAW,那麼這將不起作用;這些圖像是圖像數據的原始數組,並且沒有用於BitmapFactory的標題/等,以知道如何處理它們。您必須直接檢查像素值,因爲內容沒有以任何方式壓縮。