當使用ScriptIntrinsics我強烈建議升級到至少豆形軟糖4.3或更高版本(API18)。事情比JB 4.2(API 17)更容易使用。
ScriptIntrinsicYuvToRGB並不像看起來那麼複雜。 特別是你不需要Type.Builder對象。 相機預覽格式必須是NV21!
in onCreate()...方法創建的renderScript對象和本徵:
mRS = RenderScript.create(this);
mYuvToRGB = ScriptIntrinsicYuvToRGB.create(mRS, Element.U8_4(mRS));
有了您cameraPreviewWidth和cameraPreviewHeight計算 長度相機數據字節數組的:
int yuvDatalength = cameraPreviewWidth*cameraPreviewHeight*3/2 ; // this is 12 bit per pixel
你需要一個位圖輸出:
mBitmap = Bitmap.createBitmap(cameraPreviewWidth, cameraPreviewHeight, Bitmap.Config.ARGB_8888);
然後您創建輸入和輸出分配(這裏是API18 +中的更改)
yuvPreviewAlloc = Allocation.createSized(mRS, Element.U8(mRS), yuvDatalength);
rgbOutputAlloc = Allocation.createFromBitmap(mRS, mBitmap); // this simple !
和腳本輸入設定爲輸入分配
mYuvToRGB.setInput(yuvPreviewAlloc); // this has to be done only once !
在相機環路(每當一個新幀是avaliable)時,NV21字節陣列(數據[])複製到yuvPreviewAlloc執行腳本和複製導致爲位圖:
yuvPreviewAlloc.copyFrom(data); // or yuvPreviewAlloc.copyFromUnchecked(data);
mYuvToRGB.forEach(rgbOutputAlloc);
rgbOutputAlloc.copyTo(mBitmap);
例如:在Nexus 7(2013,傑利貝恩4.3)的全HD(1920×1080)相機預覽轉化需要大約7毫秒。
如果相機緩衝區不是「NV21」,您可能還想使用「YUV_420_888」和「YV12」。 –
我正在嘗試這個,我得到和我以前沒見過的錯誤:「E/RenderScript:YuvToRGB執行沒有數據,跳過」每個預覽幀。我嘗試添加「yuvPreviewAlloc.copyFrom(data);」只是爲了確保它不是那樣的。任何人都會遇到這個? –
此錯誤消息通常表示yuvPreviewAlloc分配沒有從相機API獲取任何數據。請仔細檢查1.如果rsPreviewSurface已正確配置爲攝像機輸出表面。 2.如果ioReceive被調用。 3.確保您使用的是「import android.renderscript。*」,因爲USAGE_IO_INPUT不支持RenderScript支持庫(導入android.support.v8.renderscript)。我還在代碼中添加了一些註釋,以向您指出該設置的一些代碼參考。 –