3

我在我的应用程序上使用相机。相机在三星 S3 之前的所有设备上都能完美运行。所有其他设备的图像都是正确的。

从 S4 获取图像时,图像被损坏并且图像被保存为水平线。

我尝试更改分辨率和一切,但仍然存在问题。

任何帮助在此处输入图像描述

4

2 回答 2

2

我一直在努力解决这个问题,我想我发现了这个问题,至少在我的应用程序方面 - 它与预览图像与捕获图像的纵横比有关。

就我而言,我的代码是根据屏幕的纵横比找出理想的预览尺寸。S4 是 1080p 手机,因此预览图像为 1920x1080,即 16:9 纵横比。但是我的代码被硬编码为捕获 4:3 的 1600x1200 图像,因为这就是我所需要的。但是 1600x1200 不是 S4 支持的有效尺寸之一。

没有设置大小,S4 捕捉到了 4128x3096,这是最大的大小,并且是 4:3,但仍然出现线条。一旦我告诉相机拍摄一张 16:9 的照片,线条就消失了。在您的情况下,您可能需要调整预览的纵横比。

这是一些可以告诉您可用尺寸的代码。

    List<Camera.Size> previewSizes = p.getSupportedPreviewSizes();

    int i = 1;

    for (Size previewSize : previewSizes) {
        Log.v("DebugCamera", "previewSize " + i++ + " width: " + previewSize.width + " height: " + previewSize.height);
    }
于 2013-06-17T21:57:34.460 回答
1

刚刚在 S4 上尝试了这段代码,它可以工作。试试看:

private Camera.Size getBestPreviewSize(int width, int height)
{
        Camera.Size result=null;    
        Camera.Parameters p = camera.getParameters();
        for (Camera.Size size : p.getSupportedPreviewSizes()) {
            if (size.width<=width && size.height<=height) {
                if (result==null) {
                    result=size;
                } else {
                    int resultArea=result.width*result.height;
                    int newArea=size.width*size.height;

                    if (newArea>resultArea) {
                        result=size;
                    }
                }
            }
        }
    return result;

}

public void surfaceCreated(SurfaceHolder holder) {
    if(myCamera == null){
        myCamera = getCameraInstance();
    try {
        myCamera.setPreviewDisplay(holder);
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // empty. Take care of releasing the Camera preview in your activity.
    // Surface will be destroyed when we return, so stop the preview.
    if (myCamera != null)
    {
        myCamera.stopPreview();
        myCamera.setPreviewCallback(null);
        myCamera.release();
    }
} 

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    //This line helped me set the preview Display Orientation to Portrait
            //Only works API Level 8 and higher unfortunately.

    camera.setDisplayOrientation(90);

    Camera.Parameters parameters = camera.getParameters();
    Camera.Size size = getBestPreviewSize(width, height);
    parameters.setPreviewSize(size.width, size.height);
    camera.setParameters(parameters);
    camera.startPreview();

}
于 2013-09-17T16:38:00.657 回答