如何使用 Camera.takePicture() 拍摄高分辨率图像?
Posted
技术标签:
【中文标题】如何使用 Camera.takePicture() 拍摄高分辨率图像?【英文标题】:How do you take high resolution images using Camera.takePicture()? 【发布时间】:2012-05-23 05:59:24 【问题描述】:我正在实现一个应用内摄像头,每次拍照时,我的图像都是 320x240,尽管我手机的摄像头能够提供更高的分辨率(Galaxy Nexus)。我找不到用于设置分辨率的参数,那么如何提高我正在拍摄的图像的分辨率?以下是相关代码:
@Override
public void surfaceCreated( SurfaceHolder holder )
setSurfaceHolder( holder );
@Override
public void surfaceDestroyed( SurfaceHolder holder )
setSurfaceHolder( null );
private void attachCameraToSurface( Camera camera, SurfaceHolder holder )
try
camera.setPreviewDisplay( holder );
setInPreview( true );
catch (IOException e)
Log.e( "CameraFragment", "Exception in attachCameraToSurface()", e );
@Override
public void surfaceChanged( SurfaceHolder holder, int format, int width, int height )
Camera camera = getCamera();
if ( camera == null )
return;
Camera.Size size = getCameraPreviewSize( camera );
Camera.Parameters params = camera.getParameters();
params.setPreviewSize( size.width, size.height );
camera.setParameters( params );
attachCameraToSurface( camera, holder );
startPreview();
private Camera.Size getCameraPreviewSize( Camera camera )
Camera.Parameters params = camera.getParameters();
List<Camera.Size> supportedSizes = params.getSupportedPreviewSizes();
Rect frame = getSurfaceHolder().getSurfaceFrame();
int width = frame.width();
int height = frame.height();
for (Camera.Size size : supportedSizes)
if ( size.width >= width || size.height >= height )
return size;
return supportedSizes.get( 0 );
@Override
public void onClick( View v )
switch (v.getId())
case R.id.camera_action_ImageView:
getCamera().takePicture( getShutterCallback(), null, new JpegPictureCallback() );
break;
private class JpegPictureCallback implements PictureCallback
@Override
public void onPictureTaken( byte[] data, Camera camera )
Bitmap bitmap = null;
try
bitmap = BitmapFactory.decodeByteArray( data, 0, data.length );
catch (OutOfMemoryError e)
Log.e( "CameraFragment", "Out of memory decoding image from camera.", e );
return;
data = null;
if ( bitmap != null )
new SavePictureWorker( getActivity() ).execute( bitmap );
startPreview();
【问题讨论】:
【参考方案1】:使用params.setPictureSize()
。有关详细信息,请参阅 Camera.Parameters。
确保您首先调用params.getSupportedPictureSizes()
以获取支持的图片尺寸数组。然后从列表中选择一个大小并使用setPictureSize()
方法设置所需的大小。
Camera.Parameters params = camera.getParameters();
List<Camera.Size> supportedSizes = params.getSupportedPictureSizes();
.
.
Camera.Size sizePicture = (one of the sizes from supportedSizes list);
.
params.setPictureSize(sizePicture.width, sizePicture.height);
【讨论】:
不知道我怎么错过了那个。谢谢。 你是天才的工作,最后我在 3 天后找到了一个解决方案 如何获取Camera.Size sizePicture 请告诉我 您可以浏览支持的尺寸集合并选择一个。如果您想要最高分辨率,您可以按分辨率(即宽度 * 高度)对集合进行排序,然后选择最大的。【参考方案2】:Camera.Parameters param;
param = camera.getParameters();
Camera.Size bestSize = null;
List<Camera.Size> sizeList = camera.getParameters().getSupportedPreviewSizes();
bestSize = sizeList.get(0);
for(int i = 1; i < sizeList.size(); i++)
if((sizeList.get(i).width * sizeList.get(i).height) > (bestSize.width * bestSize.height))
bestSize = sizeList.get(i);
List<Integer> supportedPreviewFormats = param.getSupportedPreviewFormats();
Iterator<Integer> supportedPreviewFormatsIterator = supportedPreviewFormats.iterator();
while(supportedPreviewFormatsIterator.hasNext())
Integer previewFormat =supportedPreviewFormatsIterator.next();
if (previewFormat == ImageFormat.YV12)
param.setPreviewFormat(previewFormat);
param.setPreviewSize(bestSize.width, bestSize.height);
param.setPictureSize(bestSize.width, bestSize.height);
camera.setParameters(param);
camera.takePicture(shutterCallback, rawCallback, jpegCallback);
【讨论】:
【参考方案3】:确保首先调用 camera.getSupportedPictureSizes() 以获取支持的图片尺寸数组。
其实是params.getSupportedPictureSizes();
【讨论】:
【参考方案4】:我认为,
您可以使用setPictureSize (int width, int height)
。用于设置图像尺寸(以像素为单位)。
【讨论】:
【参考方案5】:Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
int w = 0, h = 0;
for (Camera.Size size : sizes)
if (size.width > w || size.height > h)
w = size.width;
h = size.height;
parameters.setPictureSize(w, h);
【讨论】:
以上是关于如何使用 Camera.takePicture() 拍摄高分辨率图像?的主要内容,如果未能解决你的问题,请参考以下文章
Android Camera takePicture 正在使用 Previews 小缓冲区
Android Camera.takePicture() 有时不返回?
Camera1 源码解析系列—— Camera1 takePicture() 流程解析