2015-11-17 80 views
1

我知道这个话题已经出现了很多次,所以我不能得到任何解决方案的工作。我正在建立一个照相亭类型的应用程序,并且除了相机的实时取景失真(图像从上到下),所有东西都可以正常工作,这会影响最终结果,因为只有相机预览才能使叠加层失真。图像在正确的高宽比下也能很好地保存。贝娄是代码,如果需要,我可以发布更多。图像失真在相机预览

Parameters params = camera.getParameters(); 
List<Camera.Size> supportedPreviewSizes = params.getSupportedPreviewSizes(); 
Camera.Size camPreviewSize = getOptimalPreviewSize(supportedPreviewSizes, width , height); 

Log.d(TAG+"--",height +" : " + width);//display height and width 
Log.d(TAG+"--",camPreviewSize.height +" : " + camPreviewSize.width); 


params.setPreviewSize(camPreviewSize.width ,camPreviewSize.height); 
camera.setPreviewDisplay(surfaceHolder); 
camera.startPreview(); 

Calcuate预览大小

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 
    final double ASPECT_TOLERANCE = 0.1; 
    double targetRatio=(double)h/w; 

    if (sizes == null) return null; 

    Camera.Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 

    int targetHeight = h; 

    for (Camera.Size size : sizes) { 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 

    if (optimalSize == null) { 
     minDiff = Double.MAX_VALUE; 
     for (Camera.Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 
    return optimalSize; 
} 

改变的params.setPreviewSize()值似乎没有任何效果

回答

1

回答我的问题,我是缺少一个行之前,我开始相机预览。 camera.setParameters(params);

所以我的第一块应该看起来像这样。

Parameters params = camera.getParameters(); 
List<Camera.Size> supportedPreviewSizes = params.getSupportedPreviewSizes(); 
Camera.Size camPreviewSize = getOptimalPreviewSize(supportedPreviewSizes, width , height); 

Log.d(TAG+"--",height +" : " + width);//display height and width 
Log.d(TAG+"--",camPreviewSize.height +" : " + camPreviewSize.width); 


params.setPreviewSize(camPreviewSize.width ,camPreviewSize.height); 

camera.setParameters(params); //This line was missing 

camera.setPreviewDisplay(surfaceHolder); 
camera.startPreview();