EDSDK LiveView zoom 10x

时间:2015-07-26 07:03:55

标签: edsdk liveview

在EOS上使用LiveView非常有趣并且有助于使对象成为焦点(如果目标不提供自动对焦)。 LiveView图像(流)的放大确实有助于聚焦。

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

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

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

对于成功的5x LiveView缩放,我使用了以下600D代码:

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

_iZoomStage = 5;

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

这很好,但是: 如果您尝试获得更高的缩放因子失败。成功返回true,但屏幕上看不到任何效果。 如果您对相机本身进行LiveView缩放10x可以正常按下放大镜"按钮。但是以编程方式我没有成功超过5的值。

对这个话题有什么看法吗?

2 个答案:

答案 0 :(得分: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低于5x (表示2.0到3.0之间的东西)。如果你在这里使用太强的缩放值,你会得到像素"并且图像太大(你可能看不到任何东西)。

或许最好定义_zoomFactor值,以便它更符合佳能对" 5x"的理解。或" 10x"。但目前这种解决方法可能有用。

亲切的问候Gerhard Kauer

答案 1 :(得分: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会给出更精确的结果。 / p>