Android 三星Galaxy S4,从相机拍摄时图像损坏

Android 三星Galaxy S4,从相机拍摄时图像损坏,android,android-layout,galaxy,samsung-mobile,Android,Android Layout,Galaxy,Samsung Mobile,我正在我的应用程序上使用摄像头。摄像头在所有设备上都能完美工作,甚至可以在三星S3上。所有其他设备的图像都是正确的 当从S4拍摄图像时,图像被破坏,图像被保存为水平的一些线条 我试着改变决心和一切,但问题仍然存在 任何帮助我一直在为这件事大惊小怪,我想我发现了问题所在,至少在我的应用程序方面——这与预览图像与捕获图像的纵横比有关 在我的例子中,我的代码根据屏幕的纵横比嗅出理想的预览大小。S4是1080p手机,因此预览图像为1920x1080,宽高比为16:9。但是我的代码是硬编码的,可以捕获16

我正在我的应用程序上使用摄像头。摄像头在所有设备上都能完美工作,甚至可以在三星S3上。所有其他设备的图像都是正确的

当从S4拍摄图像时,图像被破坏,图像被保存为水平的一些线条

我试着改变决心和一切,但问题仍然存在


任何帮助

我一直在为这件事大惊小怪,我想我发现了问题所在,至少在我的应用程序方面——这与预览图像与捕获图像的纵横比有关

在我的例子中,我的代码根据屏幕的纵横比嗅出理想的预览大小。S4是1080p手机,因此预览图像为1920x1080,宽高比为16:9。但是我的代码是硬编码的,可以捕获1600x1200的图像,这是4:3,因为这就是我所需要的。但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);
    }
List previewSizes=p.getSupportedPreviewSizes();
int i=1;
用于(大小预览大小:预览大小){
Log.v(“调试相机”,“预览大小”+i++++“宽度:”+previewSize.width+“高度:”+previewSize.height);
}

刚刚在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();

}
private Camera.Size getBestPreviewSize(整数宽度,整数高度)
{
Camera.Size结果=null;
Camera.Parameters p=Camera.getParameters();
用于(Camera.Size大小:p.getSupportedPreviewSizes()){
如果(尺寸、宽度)