android camera 录像 分辨率,如何使用Camera.takePicture()拍摄高分辨率图像?

该博客探讨了如何在Android应用中提高相机拍照的图像分辨率。通过获取相机参数,检查支持的预览和图片大小,然后设置合适的参数,可以实现更高的图像质量。关键步骤包括设置previewSize和pictureSize,确保选择的尺寸在设备支持的范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在实现一款应用内相机,每次拍照时我的图像都是320×240,不过手机的相机能够分辨率更高(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 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(); } }

使用params.setPictureSize() 。 有关更多信息,请参阅Camera.Parameters 。

确保首先调用params.getSupportedPictureSizes()以获取支持的图片大小数组。 然后从列表中选择一个大小并使用setPictureSize()方法设置所需的大小。

Camera.Parameters params = camera.getParameters(); ListsupportedSizes = params.getSupportedPictureSizes(); . . Camera.Size sizePicture = (one of the sizes from supportedSizes list); . params.setPictureSize(sizePicture.width, sizePicture.height);

Camera.Parameters param; param = camera.getParameters(); Camera.Size bestSize = null; ListsizeList = 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); } } ListsupportedPreviewFormats = param.getSupportedPreviewFormats(); IteratorsupportedPreviewFormatsIterator = 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);

确保首先调用camera.getSupportedPictureSizes()以获取支持的图片大小数组。

实际上它是params.getSupportedPictureSizes();

我想,你可以使用setPictureSize (int width, int height) 。 它用于设置图像尺寸,以像素为单位。

Camera.Parameters parameters = camera.getParameters(); Listsizes = 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值