我在我的应用上使用相机。相机在所有设备上都能完美地工作到三星S3甚至。所有其他设备的图像都是正确的。
从S4拍摄图像时,图像会被破坏,图像会被保存,并且水平会有一些线条。
我尝试过更改分辨率,但仍然存在问题。
任何帮助
答案 0 :(得分:2)
我一直在把头发拉过来,我想我发现了这个问题,至少在我的应用程序方面 - 这与预览图像与捕获图像的纵横比有关。
就我而言,我的代码根据屏幕的宽高比嗅出了理想的预览尺寸。 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);
}
答案 1 :(得分: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();
}