首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >BitmapFactory.decodeByteArray()返回NULL

BitmapFactory.decodeByteArray()返回NULL
EN

Stack Overflow用户
提问于 2010-07-27 03:24:23
回答 4查看 28.6K关注 0票数 21

我正在使用相机中的previewCallback来尝试捕捉图像。下面是我使用的代码

代码语言:javascript
复制
private Camera.PreviewCallback mPrevCallback = new Camera.PreviewCallback() 
{
        public void onPreviewFrame( byte[] data, Camera Cam ) {
                Log.d("CombineTestActivity", "Preview started");
                Log.d("CombineTestActivity", "Data length = " 
                        + data.length );
                currentprev = BitmapFactory.decodeByteArray( data, 0, 
                        data.length );

               if( currentprev == null )
                   Log.d("CombineTestActivity", "currentprev is null" );

                Log.d("CombineTestActivity", "Preview Finished" );

        }
};

数据的长度总是与576000相同。

此外,我还尝试更改相机的参数,以便图像返回为不同的格式。这是我这样做时的样子。

代码语言:javascript
复制
mCamera = Camera.open();
camParam = mCamera.getParameters();
camParam.setPreviewFormat( ImageFormat.RGB_565 );
mCamera.setParameters( camParam );
    mCamera.setPreviewCallback( mPrevCallback );

但是,无论是当我更改预览格式时,还是当我将其保留为默认的NV21时,BitmapFactory.decodeByteArray都返回为空。我还尝试将预览格式更改为JPEG类型。我甚至在ddms中得到了一条debug语句,这就是我得到的

"D/skia (14391):- SkImageDecoder::Factory返回null“

EN

回答 4

Stack Overflow用户

发布于 2013-10-31 16:42:43

你可以试一试,它是有效的…

代码语言:javascript
复制
mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    Camera.Parameters parameters = camera.getParameters();
                    int format = parameters.getPreviewFormat();
                    //YUV formats require more conversion
                    if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) {
                        int w = parameters.getPreviewSize().width;
                        int h = parameters.getPreviewSize().height;
                        // Get the YuV image
                        YuvImage yuv_image = new YuvImage(data, format, w, h, null);
                        // Convert YuV to Jpeg
                        Rect rect = new Rect(0, 0, w, h);
                        ByteArrayOutputStream output_stream = new ByteArrayOutputStream();
                        yuv_image.compressToJpeg(rect, 100, output_stream);
                        byte[] byt = output_stream.toByteArray();
                        FileOutputStream outStream = null;
                        try {
                            // Write to SD Card
                            File file = createFileInSDCard(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg");
                            //Uri uriSavedImage = Uri.fromFile(file);
                            outStream = new FileOutputStream(file);
                            outStream.write(byt);
                            outStream.close();
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                        }
                    }
                }
票数 7
EN

Stack Overflow用户

发布于 2010-08-27 06:57:25

我也在尝试做同样的事情。根据对herehere的讨论,从Android2.1/2.2开始,人们似乎还没有幸运地让decodeByteArray()处理NV21格式。它肯定不能在我的模拟器或我的Droid上工作难以置信,尽管我认为这调用本机代码,所以它可能会在一些手机上工作取决于驱动程序?

作为另一种选择,您可以尝试自己在Java语言中解码NV21 (参见上面的链接以获取示例),尽管这显然太慢了,在大多数情况下都没有用。我也没有太多的机会尝试让CameraPreview发送不同的格式,我认为这对于试图编写可跨不同硬件移植的代码来说是有问题的。如果你用NDK编写了NV21解码方法,你可能会把帧率提高一点。

显然,在尝试处理CameraPreview时,由于竞争条件,也存在稳定性问题,尽管我自己还没有确认这个问题。我认为你可以通过使用Android2.1/2.2中添加的缓冲预览回调方法setPreviewCallbackWithBuffer()来避免这种情况,并提高帧率。这是在2.1中添加的,但直到2.2才被隐藏。To use it in 2.1 you need to hack around the hiding.

有些人建议使用MediaRecorder而不是CameraPreview。不幸的是,与CameraPreview相比,MediaRecorder提供的获取预览帧的功能似乎更少,所以我不推荐使用这种方式。

票数 3
EN

Stack Overflow用户

发布于 2018-11-27 17:52:57

这对我很有效..。

代码语言:javascript
复制
 private Camera.PreviewCallback getPreviewCallback() {
    Log.d("TAG", "previewCallBack ==> " + "getPreviewCallback");
    Camera.PreviewCallback previewBitmap = new Camera.PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            Camera.Size previewSize = camera.getParameters().getPreviewSize();
            YuvImage yuvimage=new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos);
            byte[] jdata = baos.toByteArray();
            // Convert to Bitmap
            Bitmap bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
            Log.d("TAG", "BITMAP ==> " + bitmap);
            runModelInference(bitmap);
        }
    };

    return previewBitmap;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3338235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档