相机变焦值分配引发 System.Argument 异常

Camera zoom value assignment throws System.Argument exception

我正在 Windows Phone 8.1 中开发相机应用程序,其中我使用标准屏幕 pinch/expand 手势实现了缩放。相机的预览链接到一个 CaptureElement,它有一个附加的 ManipulationDelta 事件处理程序。以下代码工作正常:

private MediaCapture CameraManager;
//initialize CameraManager

private void BaseCanvas_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    float zoomFactor = (float)(Math.Round(e.Delta.Expansion / (CameraManager.VideoDeviceController.ZoomControl.Step * 300), 0) * CameraManager.VideoDeviceController.ZoomControl.Step);
    Debug.WriteLine("Zoom factor: " + zoomFactor);
    ZoomFunction(zoomFactor);
}

private void ZoomFunction(float zoomFactor)
{
   if (CameraManager.VideoDeviceController.ZoomControl.Value + zoomFactor < CameraManager.VideoDeviceController.ZoomControl.Max && CameraManager.VideoDeviceController.ZoomControl.Value + zoomFactor > CameraManager.VideoDeviceController.ZoomControl.Min)
   {
        CameraManager.VideoDeviceController.ZoomControl.Value = CameraManager.VideoDeviceController.ZoomControl.Value + zoomFactor;
   }
}

问题是,我希望能够从事件处理程序外部调用 ZoomFunction 并按固定数量缩放 in/out。所以我简单地尝试了这个:

ZoomFunction(0.1F);

然而,上面的调用在到达 ZoomFunctionif 块内的代码行时抛出一个 System.Argument 异常和附加信息 "parameter is incorrect"。我尝试了不同的变体,如 ZoomFunction((float)(0.1)) 等等,但似乎没有任何效果。

显然参数有问题,因为这是两个调用之间的唯一区别,但我似乎无法弄清楚是什么。这不是参数的大小,因为我已经对其进行了检查以确保它不超过相机的变焦值限制。此外,我也尝试过使用通常由事件处理程序生成的值,但它们似乎也没有什么区别。

解决方案: 事实证明,缩放值必须是可以通过访问 CameraManager.VideoDeviceController.ZoomControl.Step 找到的最小步长的整数倍。我只是将 0.1 舍入到最接近的步长倍数,现在函数可以正常工作了。

您遇到的问题是对缩放系数设置的限制造成的。您的缩放系数设置为 0.1,这不是 ZoomControl.Step 的整数倍。这就是您收到 parameter is incorrect 错误的原因(假设错误消息可能提供更多信息)。有关此的更多信息,请访问 this link。如您所知,解决方案是使用整数作为缩放值,特别是步进频率的倍数(顺便说一下,如果您的步进频率是 1,您应该只能够将 1 的倍数作为有效缩放因子(即 1、2、3 等),因为根据您的步进频率,这些是唯一有效的步进。)

只是为了添加更多信息以防 link 失效,文章指出 "if StepFrequency is not equal to ZoomControl.Step" 您遇到的异常与您遇到的完全相同。 (在文章中,StepFrequency 是一个值,缩放根据滑块递增 - 这类似于您尝试应用的手动缩放因子)。如果文章说 "if StepFrequency is not a multiple of ZoomControl.Step" 可能会更准确,但至少它引导我们找到了解决方案。