簡體   English   中英

使用YuvImage壓縮時出現奇怪的錯誤

[英]Strange error when compressing using YuvImage

我想使用Rectangle直接從Camera Preview裁剪圖像。當使用以下代碼時,我的LogCat中出現以下錯誤:

skia(24596): onFlyCompress
AndroidRuntime(24596): FATAL EXCEPTION: main
AndroidRuntime(24596): java.lang.NullPointerException
AndroidRuntime(24596):  at com.example.mycameraapp.CameraActivity.getBoundData(CameraActivity.java:417)
AndroidRuntime(24596):  at com.example.mycameraapp.CameraActivity$2.onPreviewFrame(CameraActivity.java:320)
AndroidRuntime(24596):  at android.hardware.Camera$EventHandler.handleMessage(Camera.java:791)
AndroidRuntime(24596):  at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(24596):  at android.os.Looper.loop(Looper.java:137)
AndroidRuntime(24596):  at android.app.ActivityThread.main(ActivityThread.java:5103)
AndroidRuntime(24596):  at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(24596):  at java.lang.reflect.Method.invoke(Method.java:525)
AndroidRuntime(24596):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
AndroidRuntime(24596):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
AndroidRuntime(24596):  at dalvik.system.NativeStart.main(Native Method)

我的代碼在方法getBoundData生成錯誤,大概是當我使用YuvImagecompressToJpeg方法時。方法的代碼在這里:

  ByteArrayOutputStream bos;
public byte[] getBoundData(final byte[] data,final Rect rect)
{
    /*int h=mCamera.getParameters().getPictureSize().height;
    int w=mCamera.getParameters().getPictureSize().width;
    int bitsPerPixel=ImageFormat.getBitsPerPixel(mCamera.getParameters().getPictureFormat());
    int bufferSize=w*h*(bitsPerPixel/8);
    byte[] out=new byte[bufferSize];*/
    new Thread()
    {
        public void run()
        {
            final int h=mCamera.getParameters().getPreviewSize().height;
            final int w=mCamera.getParameters().getPreviewSize().width;
            YuvImage yuvImage=new YuvImage(data,ImageFormat.NV21,w,h,null);
            bos=new ByteArrayOutputStream();
            yuvImage.compressToJpeg(rect, 100, bos);
        }
    }.start();  
    //Log.d(TAG,"Bound Array Size: "+bos.size());
    return bos.toByteArray();
}

在PreviewCallback中調用此方法,如下所示:

 PreviewCallback mPreviewCallback=new PreviewCallback() {

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        // TODO Auto-generated method stub
        byte[] boxData=null;
        Rect rect=mBox.getRect();
        if(rect!=null)
            boxData=getBoundData(data,rect);
        else
            boxData=data;
                //file saving code...previously tested.

這是使用mCamera.setPreviewCallback(mPreviewCallback);調用的mCamera.setPreviewCallback(mPreviewCallback); doSnap方法中。

導致此錯誤的原因是什么?如何糾正? 此外,這是直接從Android中的CameraPreview裁剪圖像的最佳方式。

return bos.toByteArray();

你這里的bosnull 它僅在后台線程中初始化。

如果需要從后台線程傳回數據,請使用例如回調接口。 AsyncTask使后台線程任務處理更簡單BTW。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM