更改相机预览的大小不起作用(预览图片被剥离)

时间:2013-04-14 17:48:48

标签: android android-camera

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

我使用HTC Sensation(我还没有另外一部手机进行测试)

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


1920,1088

1280,720

960544

800480

720480

640480

640368

480320

352288

320240

176144


但只有640x480可以工作:(

如果我使用:

parameters.setPreviewSize(800,600);

OR

parameters.setPreviewSize(960,544);

OR

parameters.setPreviewSize(1280,720);

然后我得到的图片被删除了,我在这里给你举个例子:

enter image description here

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

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

致命信号11(SIGSEGV)位于0x417db2d9(代码= 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();
    }   

}

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

我做错了吗?

由于

2 个答案:

答案 0 :(得分:1)

回调缓冲区的大小是多少?是否足以拥有所有预览像素?

答案 1 :(得分:0)

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

我建议改编HTC手机。如果他们使用HTC手机,请将setPreviewSize设置为640x480。