天天看點

網上很多NV21資料直接使用BitmapFactory的代碼是錯誤的

  • 典型的錯誤代碼
BitmapFactory.Options options = new BitmapFactory.Options();
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        
        Bitmap bitmap = BitmapFactory.decodeByteArray(nv21, 0, nv21.length, options);
        if (bitmap != null) {
            m_canvas.drawBitmap(bitmap, m_srcRect, m_dstRect, paint);
        }      
  • NV21轉RGB的辦法
https://blog.csdn.net/quantum7/article/details/105720150
  • 查表法

吾亦用了幾套查表法,結果是顔色不對,而且性能比上述更慢。最後把這些代碼全部删除。

  • JPEG中轉
YuvImage yuvimage = new YuvImage(
                    data,
                    ImageFormat.NV21,
                    mPreviewSize.width,
                    mPreviewSize.height,
                    null);
 
            mBaos = new ByteArrayOutputStream();
            yuvimage.compressToJpeg(new Rect(0, 0, mPreviewSize.width, mPreviewSize.height), 100, mBaos);
            mImageBytes = mBaos.toByteArray();
 
            //将mImageBytes轉換成bitmap
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.RGB_565;
            mBitmap = BitmapFactory.decodeByteArray(mImageBytes, 0, mImageBytes.length, options);
            icon.setImageBitmap(mBitmap);