0

我需要处理我的相机视图生成的所有帧才能读取条形码。

我使用 HTC Sensation(我还没有其他手机可以测试它)

所以我打电话给 getSupportedPreviewSizes 来选择我可以使用的最佳分辨率,我得到了:


1920,1088

1280,720

960,544

800,480

720,480

640,480

640,368

480,320

352,288

320,240

176,144


但只有 640x480 有效:(

如果我使用:

参数.setPreviewSize(800 , 600);

或者

参数.setPreviewSize(960, 544);

或者

参数.setPreviewSize(1280, 720);

然后我得到的图片被剥离,我在这里给你看一个例子:

在此处输入图像描述

如果我使用设置 3264x1840 或 2592x1456 作为预览大小,它没有效果,生成的图片仍然有 640x480 的大小

如果我将 1920x1088 设置为预览大小,我会遇到这个致命的错误,它会自动重新启动应用程序:

致命信号 11 (SIGSEGV) 在 0x417db2d9 (code=2)

为了您的信息,我复制/粘贴了我的 onPreviewFrame 的正文:

    public void onPreviewFrame(byte[] data, Camera camera) 
    {

    int width = camera.getParameters().getPreviewSize().width;  
    int height = camera.getParameters().getPreviewSize().height; 

    Parameters parameters = camera.getParameters();

    YuvImage image = new YuvImage(data , parameters.getPreviewFormat(), width , height , null);

    String resultText = "";

    try 
    {


        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        image.compressToJpeg(new Rect(0 , 0 , image.getWidth() , image.getHeight()), 100, baos);

        // Convertie YUV TO BITMAP
        Bitmap bitmap = BitmapFactory.decodeByteArray( baos.toByteArray(), 0,  baos.size());

        FileOutputStream outStream = new FileOutputStream("/sdcard/" + System.currentTimeMillis() + ".jpg");

            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);

            outStream.close();

            outStream.flush();

    }
    catch (Exception e) 
    {
             e.printStackTrace();
        }    

  }

我用我的 surfaceChanged 函数的代码更新了我的帖子,其中包括回调缓冲区的代码:

    @Override
public void surfaceChanged(SurfaceHolder holder,  int format, int width, int height) 
{

    try 
    {
        Parameters parameters = camera.getParameters();

    //  parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); // ACTIVE FLASH SI NECESSAIRE
    //  parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO ); // ACTIVE AUTOFOCURS
    //  parameters.setSceneMode(Camera.Parameters.SCENE_MODE_STEADYPHOTO);

        String focusMode = Utils.findSettableValue(parameters.getSupportedFocusModes(), Camera.Parameters.FOCUS_MODE_AUTO, Camera.Parameters.FOCUS_MODE_MACRO);

        if (focusMode != null) 
        {
            parameters.setFocusMode(focusMode);
        }

        Log.e(TAG , "PREVIEWS : ");

        List<Size> previews = parameters.getSupportedPreviewSizes();

        for(int i = 0 ; i < previews.size() ; i++) 
        {
            Log.e(TAG , i + " : " + previews.get(i).width + "," + previews.get(i).height);
        } 

        Log.e(TAG , "PICTURES : ");

        List<Size> pictures = parameters.getSupportedPictureSizes();

        for(int i = 0 ; i < pictures.size() ; i++) 
        {
            Log.e(TAG , i + " : " + pictures.get(i).width + "," + pictures.get(i).height);
        } 

        Size preview = previews.get(1);

        parameters.getSupportedPictureSizes();


//      parameters.setPreviewSize(preview.width , preview.height);

    //  Camera.Size size = getBestPreviewSize(width, height);



        parameters.setPictureSize(1280 , 720);
        parameters.setPreviewSize(1280 , 720);

        camera.setParameters(parameters);

    //  camera.setDisplayOrientation(90);
        camera.setPreviewDisplay(holder);
        camera.setPreviewCallback(this);
        camera.startPreview();
        camera.autoFocus(autoFocusCallback);

        ///////////////////////////////////////////////////////////

        int imgformat = parameters.getPreviewFormat();
        int bitsperpixel = ImageFormat.getBitsPerPixel(imgformat);

        Camera.Size camerasize = parameters.getPreviewSize();
        int frame_size = ((camerasize.width * camerasize.height) * bitsperpixel) / 8;

        byte[] buffer = new byte[frame_size];
        camera.addCallbackBuffer(buffer);



    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }   

}

但即使使用回调缓冲区,问题仍然存在,图片被剥离。

我做错什么了吗 ?

谢谢

4

2 回答 2

1

回调缓冲区的大小是多少?拥有所有预览像素就足够了吗?

于 2013-04-15T19:39:45.877 回答
0

据我所知,HTC G11也有同样的问题(setPreviewSize超过1280x720)。

我建议适配HTC手机。如果他们使用的是 HTC 手机,请将 PreviewSize 设置为 640x480。

于 2013-07-09T06:26:41.913 回答