Camera 1 API缩放更新参数致颜色随机变化及画面拉伸问题求助
解决Camera 1 API缩放后的颜色异常与画面拉伸问题
针对你遇到的两个问题,我分享下实际开发中踩过坑后的解决思路:
一、解决缩放后画面颜色随机变化的问题
出现这个问题的核心原因是:调用setParameters()时,部分设备会自动重置图像相关的参数(比如白平衡、色彩效果、曝光补偿等)到默认值,而非保留当前设置。解决办法就是在修改缩放前,先保存这些关键的颜色参数,设置完缩放后再手动恢复。
示例代码如下:
Camera.Parameters parameters = mCamera.getParameters(); // 1. 保存当前的颜色/图像相关参数 String whiteBalance = parameters.getWhiteBalance(); String colorEffect = parameters.getColorEffect(); int exposureCompensation = parameters.getExposureCompensation(); String sceneMode = parameters.getSceneMode(); // 2. 设置缩放值 parameters.setZoom(newZoomValue); // 3. 恢复之前保存的参数,避免被重置 if (parameters.getSupportedWhiteBalances().contains(whiteBalance)) { parameters.setWhiteBalance(whiteBalance); } if (parameters.getSupportedColorEffects().contains(colorEffect)) { parameters.setColorEffect(colorEffect); } parameters.setExposureCompensation(exposureCompensation); if (parameters.getSupportedSceneModes().contains(sceneMode)) { parameters.setSceneMode(sceneMode); } // 4. 应用参数 mCamera.setParameters(parameters);
这样就能避免因参数重置导致的颜色随机变化问题,注意调用前先判断设备是否支持对应参数,避免崩溃。
二、修复缩放时画面拉伸的问题
画面拉伸主要是相机预览尺寸与显示控件(SurfaceView/TextureView)的比例不匹配,或者缩放后没有维持正确的画面比例导致的。可以按以下步骤解决:
1. 选择与显示控件比例匹配的预览尺寸
首先要获取相机支持的所有预览尺寸,筛选出和你的显示控件比例一致的尺寸,避免因比例差异导致的拉伸。
先写一个工具方法获取最优预览尺寸:
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int targetWidth, int targetHeight) { double targetRatio = (double) targetWidth / targetHeight; double minRatioDiff = Double.MAX_VALUE; Camera.Size optimalSize = null; // 优先找比例完全匹配的尺寸 for (Camera.Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) < minRatioDiff) { minRatioDiff = Math.abs(ratio - targetRatio); optimalSize = size; } } // 如果找不到比例匹配的,选最接近控件尺寸的 if (optimalSize == null) { minRatioDiff = Double.MAX_VALUE; for (Camera.Size size : sizes) { int sizeDiff = Math.abs(size.width - targetWidth) + Math.abs(size.height - targetHeight); if (sizeDiff < minRatioDiff) { minRatioDiff = sizeDiff; optimalSize = size; } } } return optimalSize; }
2. 设置预览尺寸并调整显示方向
在初始化相机或修改缩放时,先设置好最优预览尺寸,同时调整相机的显示方向(适配竖屏/横屏):
// 获取显示控件的实际尺寸(比如SurfaceView) int viewWidth = surfaceView.getMeasuredWidth(); int viewHeight = surfaceView.getMeasuredHeight(); Camera.Parameters parameters = mCamera.getParameters(); List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); // 获取最优预览尺寸 Camera.Size optimalPreviewSize = getOptimalPreviewSize(previewSizes, viewWidth, viewHeight); parameters.setPreviewSize(optimalPreviewSize.width, optimalPreviewSize.height); // 设置缩放值 parameters.setZoom(newZoomValue); // 恢复颜色参数(参考第一个问题的代码) // ... // 适配竖屏显示(根据你的界面方向调整,比如竖屏设90度) mCamera.setDisplayOrientation(90); // 应用参数 mCamera.setParameters(parameters);
3. 优先使用光学变焦(如果设备支持)
如果设备支持光学变焦,优先使用它替代数字变焦,能最大程度避免画面拉伸:
if (parameters.isOpticalZoomSupported()) { // 光学变焦的取值范围和数字变焦不同,需要用getMaxOpticalZoom()获取最大值 parameters.setOpticalZoom(newOpticalZoomValue); } else if (parameters.isZoomSupported()) { parameters.setZoom(newZoomValue); }
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

