【发布时间】:2015-07-31 04:58:42
【问题描述】:
我的应用程序有问题,具体来说,当我想(从 android Camera API)拍照并将其发送到我的服务器时,我得到了一些奇怪的图片,如下例所示:
其中包含许多噪声点,实际上尺寸/分辨率非常小(176*144 像素)。这是我对 surfaceChanged 的原始代码:
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// start preview with new settings
try {
Camera.Parameters parameters = mCamera.getParameters();
parameters.set("orientation", "portrait");
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.e(LOG_TAG, "Error starting camera preview: " + e.getMessage());
}
mCamera.startPreview();
}
我试着问了一些同学这个问题,他们不知道,但其中一个给出了以下代码:
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
try {
// camera.stopPreview();
// Camera.Parameters mParameters = camera.getParameters();
Camera.Parameters parameters = mCamera.getParameters();
Camera.Size optiSize = getBestPreviewSize(720, 720);
if (optiSize != null) {
parameters.setPreviewSize(optiSize.width, optiSize.height);
parameters.setPictureSize(optiSize.width, optiSize.height);
}
parameters.set("orientation", "portrait");
mCamera.setDisplayOrientation(90);
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
mCamera.setParameters(parameters);
// mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
// camera.setParameters(mParameters); // apply the changes
} catch (Exception e) {
// older phone - doesn't support these calls
}
mCamera.startPreview();
}
private Camera.Size getBestPreviewSize(int width, int height) {
List<Camera.Size> sizes = mCamera.getParameters()
.getSupportedPreviewSizes();
if (sizes == null)
return null;
Camera.Size optimalSize = null;
int tmpSize;
int minWidthDiff = 1000;
for (Camera.Size size : sizes) {
if (size.width > size.height)
tmpSize = size.height;
else
tmpSize = size.width;
if (Math.abs(tmpSize - width) < minWidthDiff) {
minWidthDiff = Math.abs(tmpSize - width);
optimalSize = size;
}
}
return optimalSize;
}
而且这个效果很好,它可以存储全分辨率的原始图片。尽管我修改了一些其他代码以使新代码与我的系统兼容(例如,添加 AutoFocus)。但我认为问题的出现是因为方法 surfaceChanged 因为如果我只使用自动对焦拍摄图像,它仍然不起作用。
因此我的问题是:为什么这种方法会影响我的图像质量。我认为这个方法只有在我们“改变”表面时才会被调用,比如旋转屏幕。但显然它的作用不止于此?
有人可以帮我吗?或者一些帖子来解释这个事实?非常感谢您。
【问题讨论】:
标签: android image android-camera