1

在 EOS 上使用 LiveView 很有趣,并且有助于使对象聚焦(在不提供自动对焦的目标的情况下)。LiveView 图像(流)的放大确实有助于聚焦。

在相机网站上,您可以使用带有放大镜图标的按钮将 LiveView 图像放大 5 倍和 10 倍。这适用于我的 600D。

使用 EDSDK 编程我遇到了一个问题:可以通过编程方式为 LiveView 设置 5 倍缩放模式。但是我在 10 倍模式下没有成功。

有没有人成功地进行缩放 LiveView 并将 LiveView 图像缩放超过 5 倍?

为了成功实现 5 倍 LiveView 变焦,我为 600D 使用了以下代码:

// 启动 LiveView 等待屏幕上出现的流,然后执行:

_iZoomStage= 5;

bool Success=_CameraHandler.SetSetting(EDSDK.PropID_Evf_Zoom,(UInt32) _iZoomStage);

效果很好,但是:如果您尝试获得更高的缩放系数,则会失败。成功返回 true,但屏幕上看不到任何效果。如果您在相机本身上进行 LiveView 缩放 10 倍,则按下“放大镜”按钮可以正常工作。但是以编程方式,我没有成功获得大于 5 的值。

对那个话题有任何想法吗?

4

2 回答 2

2

嗯,非常感谢您的回答。

同时我做了以下解决方法,这似乎解决了这个问题。我只是在 LiveView 流式传输期间裁剪和缩放位图:

if(_zoomFactorOfEdskd == true)   // That is 1 and 5
 g.DrawImage(_LiveViewStreamedBmp,_LvOutput);
else  // Our own ones which do not work with EDSDK
 { 
  Int32 newWidth=  (Int32)(_LiveViewStreamedBmp.Width  / _zoomFactor);
  Int32 newHeight= (Int32)(_LiveViewStreamedBmp.Height / _zoomFactor);

  // Cropping around the center of the original bitmap
  Int32 xOffset= (_LiveViewStreamedBmp.Width-newWidth)/2;
  Int32 yOffset= (_LiveViewStreamedBmp.Height-newHeight)/2;

  Rectangle rectSource=new Rectangle(xOffset, xOffset, newWidth,newHeight);
  Rectangle rectTarget=new Rectangle( 0,  0, _LiveViewStreamedBmp.Width, _LiveViewStreamedBmp.Height);            

// Do the zoomed output...
g.DrawImage(_LiveViewStreamedBmp,rectTarget,rectSource,GraphicsUnit.Pixel);           
}

请注意,当 _zoomFactor 低于 5 倍(表示介于 2.0 和 3.0 之间)时,会出现“非常好的”结果。如果你在这里使用太强的缩放值,你会得到“像素”并且图像尺寸太大(你可能看不到任何东西)。

或许以其他方式定义 _zoomFactor 值是一个好主意,以便它更适合佳能对“5x”或“10x”的理解。但目前这种解决方法可能有用。

亲切的问候格哈德考尔

于 2015-07-27T06:44:32.180 回答
1

我偶然发现了同样的问题(在 5D Mark IV 上) - 实际上只有 5 倍缩放是可能的,而对于 10 倍缩放,您应该自己缩放返回的位图。

但是:这似乎不是一个错误,而是一个非常糟糕的记录功能(即根本没有记录)。SDK 实际上会提供额外的数据来提示您应该进行软件缩放并提供精确的坐标。所以这就是我的理解:

假设我们有一个分辨率为 1000 x 1000 像素的传感器,我们想在中心放大 10 倍。然后这发生在我的测试中:

  • 读取kEdsPropID_Evf_ZoomRect返回位置 450:450 和大小 100x100 - 一切都符合预期。
  • 读取kEdsPropID_Evf_ZoomPosition回报 450:450 - 也是预期的。
  • 但是您会收到一个 200 x 200 像素的位图 - “错误”,因为这是用于 x5 缩放...您会期望 100 x 100,但这是在各种相机上观察到的,因此可能是正常现象。
  • 但是通过阅读kEdsPropID_Evf_ImagePosition你可以知道这个位图实际上在哪里。这将返回 400:400 位置,因此可用于计算返回位图的最终裁剪和放大。

因此,虽然 user3856307 的代码应该可以工作,但相机可能存在一些限制(例如返回可被 32 整除的位置的位图),因此kEdsPropID_Evf_ImagePosition在我看来,合并应该会给出更精确的结果。

于 2017-02-19T21:09:10.467 回答