我正在尝试做两件事中的一件,首选号为1:
使用VB.NET和Canon EDSDK 2.5.2打开实时视图,并在Windows窗体应用程序中呈现实时输出。目前我正试图把它放到一个图片框;但是,我很乐意接受建议。
第二个选项是至少打开实时视图,让它通过相机上的视频输出流到显示器。
我真的想完成第一个!以下是我目前的代码库,帮助!
Private Sub btnStartLiveView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartLiveView.Click
Dim err As Integer = EDS_ERR_OK
Dim prop As Integer = EdsEvfOutputDevice.kEdsEvfOutputDevice_PC
Dim proptype As Integer = EDSDKTypes.kEdsPropID_Evf_OutputDevice
'// Stock the property.'
Dim wkIntPtr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(prop))
Marshal.StructureToPtr(prop, wkIntPtr, False)
'send property/command to the camera'
EdsSetPropertyData(model.getCameraObject(), proptype, 0, Marshal.SizeOf(prop), prop)
Dim stream As IntPtr
Dim outMemoryRef As IntPtr
Dim evfImage As IntPtr
err = EdsCreateMemoryStream(0, stream)
If err = EDS_ERR_OK Then
err = EdsCreateImageRef(stream, outMemoryRef) '(stream, evfImage)'
Else
Dim str As String = Hex(err)
MessageBox.Show(str)
End If
If err = EDS_ERR_OK Then
err = EdsDownloadEvfImage(model.getCameraObject(), evfImage)
Else
Dim str As String = Hex(err)
MessageBox.Show("&H" & str & "L") ' Shows &H2CL which = ERR_FILE_FORMAT_NOT_RECOGNIZED'
End If
' Get the Incidental Data of the Image'
If err = EDS_ERR_OK Then
Dim zoom As UInt32
Dim point As IntPtr
EdsGetPropertyData(outMemoryRef, kEdsPropID_Evf_ZoomPosition, 0, Marshal.SizeOf(zoom), zoom)
EdsGetPropertyData(outMemoryRef, kEdsPropID_Evf_ZoomPosition, 0, Marshal.SizeOf(point), point)
Else
'MessageBox.Show(err.ToString())'
End If
Dim buffer(Marshal.SizeOf(stream)) As Byte
Dim mStream As System.IO.Stream = New System.IO.MemoryStream(Marshal.SizeOf(stream))
Dim gcTime As GCHandle = GCHandle.Alloc(0, GCHandleType.Pinned)
Dim pTime As IntPtr = gcTime.AddrOfPinnedObject()
Marshal.Copy(stream, buffer, 0, Marshal.SizeOf(stream))
mStream.Write(buffer, 0, Marshal.SizeOf(stream))
Me.PictureBox1.Image = Image.FromStream(mStream)
EdsRelease(stream)
End Sub
答案 0 :(得分:2)
这是一个.vb文件,我在其中定义了类Camera,它可以让你做一些顶级的事情,比如
Dim camera as New Camera
camera.EstablishSession()
camera.TakePicture("C:\path\to\save.jpg")
camera.StartLiveView(me.LiveViewPictureBox)
camera.StopLiveView()
camera.FlushTransferQueue()
我认为您可能会发现它很有用:
<snip>
多年来,我收到了多封电子邮件,要求更新这段代码,这些代码在GitHub上作为开源代码:
http://github.com/superjoe30/Camlift-Controller
Camera类位于slnCamliftController / src / Camera.vb
中这些代码有些令人尴尬。例如,为了让它适用于5D和7D相机,我必须创建一个初始化SDK然后故意崩溃的程序。可怕!我知道!这可以在Klugesaurus中找到。就像当你尝试连接到5D或7D时,没有任何作用。那里有一个尖峰坑。因此,我们将一个农民(The Klugesaurus)推到钉子上,杀死了他(它无声地失败),所以我们可以穿过农民的尸体走向安全。
这很丑陋,但是: 它每次都有效。 如果你不这样做,它就不起作用。 我曾多次询问佳能他们是否会发布EOS Utility的源代码,它可以完美地连接到5D和7D。他们每次坚决拒绝。我的同事开玩笑说,他们不想透露他们也在使用Klugesaurus。 无论如何,我只想给你一个令人讨厌的细节。
我还创建了一个与相机接口的Python模块: http://github.com/superjoe30/pyedsdk
答案 1 :(得分:2)
我是最初发布此问题的人。我看到这里还有其他人仍在寻找答案。我已在http://www.overridepro.com/2009/06/28/canon-sdk-live-view/的博客上发布了我们最终提出的解决方案。
答案 2 :(得分:0)
有代码示例here,并讨论了完成它的不同方法。