相机PreviewSize在takePicture时自动更改

时间:2015-01-05 17:53:45

标签: android android-camera surfaceview

我在SurfaceChanged方法上使用 getOptimalPreviewSize()方法。单击拍照后按钮使用它预览尺寸返回第一尺寸并返回。

必须保持相同的预览尺寸。为什么会改变?

enter image description here

此处代码:

PictureCallback myPictureCallback_JPG = new PictureCallback(){
   @Override
   public void onPictureTaken(byte[] data, Camera camera) {
       File pictureFile = getOutputMediaFile();
       if (pictureFile == null){               
           return;
       }           

       try {

           FileOutputStream fos = new FileOutputStream(pictureFile);
           fos.write(data);
           fos.close();

        } catch (FileNotFoundException e) {
            Log.d("Method.PictureCallBack", "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d("Method.PictureCallBack", "Error accessing file: " + e.getMessage());
        }

        camera.startPreview();
  }
};

ShutterCallback myShutterCallback = new ShutterCallback(){
       @Override
       public void onShutter() {}
};

PictureCallback myPictureCallback_RAW = new PictureCallback(){
       @Override
       public void onPictureTaken(byte[] arg0, Camera arg1) {}
};

public void takePicture() {
    mCamera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);

}

2 个答案:

答案 0 :(得分:1)

预览尺寸和图片尺寸不同。使用getPreviewSize()获取屏幕上预览的尺寸。使用getPictureSize(),您可以获得调用takePicture时将拍摄的图片的确切尺寸。

答案 1 :(得分:0)

我知道这可能是一个迟到的答案,但无论如何,我想分享我对这个问题的解决方案。

要解决此问题,您需要做的就是:

  1. 使用Camera.Params.getSupportedPictureSizes()方法获取所有支持的图片尺寸。

  2. 找到最可接受的尺寸并将它们存储在临时容器中(ArrayList可以正常工作)

  3. 找到您想要使用的尺寸,并实际为相机提供您想要使用的尺寸,使用Camera.Params.setPictureSize(宽度,高度)

  4. 这不是第四步,而是第三步。 在大多数情况下,默认情况下您的相机将设置不正确的方向,如果未事先调整,图像也将如此。 所以,我强烈建议你使用Camera.Params.setRotation(角度) 用于图片方向更改,以及预览方向更改的Camera.Params.setDisplayOrientation(角度)。

  5. 以下是用图片大小做的事情的代码:

       private void Form1_Load(object sender, EventArgs e)
        {
            TableLayoutPanel brickGrid = new TableLayoutPanel();
            brickGrid.CellBorderStyle = TableLayoutPanelCellBorderStyle.InsetDouble;
            brickGrid.SetAutoScrollMargin(2, 2);
            brickGrid.BringToFront();
            brickGrid.BackColor = Color.Red;
            panel1.Controls.Add(brickGrid);
        }
    

    其中shouldSizeDimensionsBeFlipped是一个布尔值,它确定我们是否需要考虑从相机大小中提取的内容为翻转(宽度为高度,高度为宽度)或不是(我们只需要这样做,如果默认的摄像头方向是除0和270之外的所有内容

    我希望这会帮助那些遇到同样问题的人:)