安静的竹子 發表於 2021-1-13 17:18:00

Android Camera开发系列:预览镜头缩放(数码变焦)

<h2 id="写在前面">写在前面:</h2>
<p>这篇文章主要介绍Camera2 API上,如果进行相机镜头的缩放,这里说的缩放指定的数码变焦。</p>
<p>如下图所示,左边是正常情况下的画面,右侧是镜头拉近的画面,接下来,我们就看下代码上是如何实现的。<br>
​<img src="https://upload-images.jianshu.io/upload_images/16344730-6e9fc61f9f591381?imageMogr2/auto-orient/strip%7CimageView2/2/w/200"></p>
<p>​<img src="https://upload-images.jianshu.io/upload_images/16344730-cbfb873c5a15036c?imageMogr2/auto-orient/strip%7CimageView2/2/w/200"></p>
<h2 id="一-我们先来看下google为我们提供了哪些相关的接口">一、 我们先来看下Google为我们提供了哪些相关的接口,</h2>
<p>1、获取支持的最大数码变焦倍数<br>
CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM</p>
<p>2、请求裁剪范围<br>
CaptureRequest.SCALER_CROP_REGION,</p>
<p>从上面的接口我们也可以看的出来,我们需要进行镜头缩放,那肯定得知道设备支持的最大数码变焦倍数,这个决定了我们可以调节的范围。数码变焦的原理,就是对数据进行了裁剪,那我们就需要设置图像需要显示的区域矩形,这个Google也为我们提供了相对应的请求接口CaptureRequest.SCALER_CROP_REGION。</p>
<h2 id="二接下来看下代码上的具体实现">二、接下来看下代码上的具体实现:</h2>
<pre><code>/**
* 进行镜头缩放
* @param zoom 缩放系数(0~1.0)
**/
public void applyZoom(float zoom) {
            float old = mZoomValue;
      mZoomValue = zoom;

      if(mCameraCharacteristics != null){
         float maxZoom = mCameraCharacteristics.get(
                CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
         // converting 0.0f-1.0f zoom scale to the actual camera digital zoom scale
         // (which will be for example, 1.0-10.0)
         float calculatedZoom = (mZoomValue * (maxZoom - 1.0f)) + 1.0f;
         Rect newRect = getZoomRect(calculatedZoom, maxZoom);
         mPreviewBuilder.set(CaptureRequest.SCALER_CROP_REGION, newRect);

         mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler);
      }
}

/**
* 获取缩放矩形
**/
private Rect getZoomRect(float zoomLevel, float maxDigitalZoom) {
            Rect activeRect = new Rect();

      activeRect = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);

      int minW = (int) (activeRect.width() / maxDigitalZoom);
      int minH = (int) (activeRect.height() / maxDigitalZoom);
      int difW = activeRect.width() - minW;
      int difH = activeRect.height() - minH;

      // When zoom is 1, we want to return new Rect(0, 0, width, height).
      // When zoom is maxZoom, we want to return a centered rect with minW and minH
      int cropW = (int) (difW * (zoomLevel - 1) / (maxDigitalZoom - 1) / 2F);
      int cropH = (int) (difH * (zoomLevel - 1) / (maxDigitalZoom - 1) / 2F);
      return new Rect(cropW, cropH, activeRect.width() - cropW,
                activeRect.height() - cropH);
}

</code></pre>
<p>---------- 2020.10.23</p>
<hr>
<h6 id="本人从事android-camera相关开发已有5年">*<em>本人从事Android Camera相关开发已有5年,</em></h6>
<h6 id="目前在深圳上班">*<em>目前在深圳上班,</em></h6>
<h6 id="小伙伴记得点我头像看个人介绍进行关注哦希望和更多的小伙伴一起交流-">*<em>小伙伴记得点我头像,看【个人介绍】进行关注哦,希望和更多的小伙伴一起交流 ~</em></h6>
<p>=======================================================================</p>
<h6 id="本人从事android-camera相关开发已有5年-1">*<em>本人从事Android Camera相关开发已有5年,</em></h6>
<h6 id="目前在深圳上班-1">*<em>目前在深圳上班,</em></h6>
<h6 id="小伙伴记得点我头像关注也可以关注我的微信公众号小驰笔记希望和更多的小伙伴一起交流-">*<em>小伙伴记得点我头像关注,也可以关注我的微信公众号【小驰笔记】,希望和更多的小伙伴一起交流 ~</em></h6>
<p><img src="https://img2020.cnblogs.com/blog/2279751/202101/2279751-20210113164428529-1663209907.png"></p><br><br>
来源:https://www.cnblogs.com/york-zhou/p/14273194.html
頁: [1]
查看完整版本: Android Camera开发系列:预览镜头缩放(数码变焦)