DreamCamera2相机预览变形的处理

最近遇到一个问题,相机更换了摄像头后,发现人像角度顺时针旋转了90度,待人像角度正常后,发现 预览时图像有挤压变形,最终解决。在此记录

一人像角度的修改

先放示意图

设备预览人像角度如图1所示,顺时针旋转了90,正常效果如图2 修改如下:

//文件路径: /device/sprd/qogirn6l/ums9158_1h10/ums9158_1h10/module/camera/sensor_config.xml 
Date:   Wed Nov 27 18:02:01 2024 +0800

    修复顺时针旋转90度摄像头预览
    
    Change-Id: Ife0a46fe32ffd2c213d0ba0ab1eba07be50c8055

diff --git a/ums9158_1h10/module/camera/sensor_config.xml b/ums9158_1h10/module/camera/sensor_config.xm​‌​
l
index 20031a4..60aa732 100755
--- a/ums9158_1h10/module/camera/sensor_config.xml
+++ b/ums9158_1h10/module/camera/sensor_config.xml
@@ -6,7 +6,7 @@
         <SlotId>0</SlotId>
         <SensorName>ov8858_ft18</SensorName>
         <Facing>BACK</Facing>
-        <Orientation>270</Orientation>
+        <Orientation>180</Orientation>^M
         <Resource_cost>100</Resource_cost>
         <TuningParameter>
             <TuningName>ov8858_main_ft18</TuningName>

 如上修改,,可以相机后摄像头预览时人像角度(前摄也应该在改文件中,找front选项和对应项目名称)

二相机预览时图像挤压变形

步骤一完成后,图像角度正常了,但是内容挤压变形了。效果如下所示

图1       图2

如上图,左侧图1时被挤压时效果,右图2是修改后正常效果。

刚开始以为问题再驱动层,和同事沟通后发现,应该在应用层,相机设置里个比例设置,默认全屏模式,只是比例有问题。然后看源码,角度不对的时候无挤压,旋转后有挤压,说明比例反了(设备屏幕宽高比)做此判断,如下修改

~~思路:默认只是角度不对,但是没有挤压,说明原有的比例和屏幕比例一致所以正常

旋转了角度,图像比例和屏幕比例不一致,导致挤压,根据源码,将其比例反过来就可以了~~

-----------------------------------20241129 update--------------------------

比例不对这个判断是对的。将宽高比换下,经过测试也是不对的。屏幕是长x款 是640x480 比例为4:3.旋转后还是又拉长的。只能使用1:1.上面的图2 效果图也是1:1比例,而不是全屏。修改是是删除其他比例选项只保留1:1选项。

-----------------------update end-----------------------

(可以在设置中选择1:1比例图像正常,说明 比例问题)

vendor/sprd/platform/packages/apps/DreamCamera2/src/com/android/camera/settings$ git diff
diff --git a/src/com/android/camera/settings/ResolutionUtil.java b/src/com/android/camera/settings/ResolutionUtil.java
index 432e28d0..cbe823ff 100644
--- a/src/com/android/camera/settings/ResolutionUtil.java
+++ b/src/com/android/camera/settings/ResolutionUtil.java
@@ -39,6 +39,8 @@ import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import com.android.camera.debug.Log;
+
 
 import javax.annotation.Nonnull;
 import javax.annotation.ParametersAreNonnullByDefault;
@@ -52,6 +54,9 @@ import javax.annotation.ParametersAreNonnullByDefault;
  * user with so many options.
  */
 public class ResolutionUtil {
+
+        private static final Log.Tag TAG = new Log.Tag("ResolutionUtil");
+
     /**
      * Different aspect ratio constants.
      */
@@ -75,14 +80,20 @@ public class ResolutionUtil {
             Point point = new Point();
             Display d = activity.getWindowManager().getDefaultDisplay();
             d.getRealSize(point);
            mFullScreenSize = point.x > point.y ? new Size(point.x, point.y) : new Size(point.y, point.x);

+            Log.e(TAG, "setDesiredAspectRatio, point.x:" + point.x+",point.y:" + point.y);
+            Log.e(TAG, "setDesiredAspectRatio, mFullScreenSize:" + mFullScreenSize);
 
            // sDesiredAspectRatioSizes.add(new Size(4,3));
             //sDesiredAspectRatioSizes.add(mFullScreenSize);
             sDesiredAspectRatioSizes.add(new Size(1,1));
 
            // sDesiredAspectRatios.add(4.0f / 3.0f);

+            Log.e(TAG, "setDesiredAspectRatio, mFullScreenSize.width():" + mFullScreenSize.width() +",mFullScreenSize.height():" + mFullScreenSize.height());
+            Log.e(TAG, "setDesiredAspectRatio, mFullScreenSize.width() / (float) mFullScreenSize.height()=" + mFullScreenSize.width() / (float) mFullScreenSize.height());
+            
+            // sDesiredAspectRatios.add(mFullScreenSize.width() / (float) mFullScreenSize.height());

             sDesiredAspectRatios.add(1.0f / 1.0f);
             settled = true;
         }

测试通过over!

ps:怎么判断当前的应用在项目中那个路径,可以看我的历史文章

[转]Android寻找某个包在aosp下的路径

### 如何对 DreamCamera2 进行性能优化或配置调优 为了实现 DreamCamera2 的性能优化和配置调优,可以从以下几个方面入手: #### 1. **调整预览分辨率** 通过合理设置预览分辨率来提升性能。过高的分辨率可能导致设备负载增加,而较低的分辨率可能影响用户体验。可以根据目标硬件的能力选择合适的分辨率。 - 在 `CameraUtil` 文件中定义支持的分辨率列表,并根据实际需求动态切换。 - 使用 Android Camera2 API 提供的功能检测最佳匹配的分辨率[^3]。 ```java // 获取推荐的最佳预览尺寸 Size recommendPreviewSize = chooseOptimalSize( map.getOutputSizes(SurfaceTexture.class), width, height); ``` #### 2. **减少不必要的计算开销** 在图像处理过程中,避免执行冗余操作。例如,在实时预览阶段仅启用必要的功能模块(如自动曝光、白平衡),关闭其他耗时的操作。 - 如果存在自定义滤镜或其他复杂算法,则应考虑将其移至后台线程运行以防止阻塞主线程[^4]。 #### 3. **内存管理改进** 对于大容量数据结构(比如位图对象),及时释放不再使用的资源能够有效降低 OOM (Out of Memory) 错误发生的概率。 - 利用 Recycler 模式重用 Bitmap 对象而不是频繁创建销毁它们;或者采用第三方库 Glide/Picasso 来加载显示图片从而简化流程并提高效率[^5]。 #### 4. **异步任务调度** 将长时间运行的任务放入单独的工作队列里去完成,这样就不会干扰 UI 更新频率造成卡顿现象发生。 - 可借助 ExecutorService 创建固定大小池子来进行并发控制以及结果回调机制设计[^1]。 ```java ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); public void executeTask(Runnable task){ executor.execute(task); } ``` #### 5. **适配不同机型特性** 考虑到市场上众多品牌型号之间的差异性较大,因此有必要针对特定系列手机做专门定制化参数微调工作以便达到更佳效果表现。 - 查阅官方文档获取关于各个厂商特殊接口扩展说明资料用于指导开发实践过程中的具体实施细节[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值