我在SurfaceChanged方法上使用 getOptimalPreviewSize()方法。单击拍照后按钮使用它预览尺寸返回第一尺寸并返回。
必须保持相同的预览尺寸。为什么会改变?
此处代码:
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);
}
答案 0 :(得分:1)
预览尺寸和图片尺寸不同。使用getPreviewSize()获取屏幕上预览的尺寸。使用getPictureSize(),您可以获得调用takePicture时将拍摄的图片的确切尺寸。
答案 1 :(得分:0)
我知道这可能是一个迟到的答案,但无论如何,我想分享我对这个问题的解决方案。
要解决此问题,您需要做的就是:
使用Camera.Params.getSupportedPictureSizes()方法获取所有支持的图片尺寸。
找到最可接受的尺寸并将它们存储在临时容器中(ArrayList可以正常工作)
找到您想要使用的尺寸,并实际为相机提供您想要使用的尺寸,使用Camera.Params.setPictureSize(宽度,高度)
这不是第四步,而是第三步。 在大多数情况下,默认情况下您的相机将设置不正确的方向,如果未事先调整,图像也将如此。 所以,我强烈建议你使用Camera.Params.setRotation(角度) 用于图片方向更改,以及预览方向更改的Camera.Params.setDisplayOrientation(角度)。
以下是用图片大小做的事情的代码:
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之外的所有内容
我希望这会帮助那些遇到同样问题的人:)