4

私は2つのことのうちの1つ、優先番号1を実行しようとしています:

VB.NET と Canon EDSDK 2.5.2 を使用してライブ ビューをオンにし、Windows フォーム アプリケーションでライブ出力をレンダリングします。現在、私はそれをピクチャーボックスに入れようとしています。ただし、私は確かに提案を受け入れています。

2 番目のオプションは、少なくともライブ ビューをオンにして、カメラのビデオ出力を介してモニターにストリーミングすることです。

本当は1番やりたいんですけどね!以下は私の現在のコードベースです、助けてください!

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
4

3 に答える 3

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)をスパイクに押し付け、彼を殺しました(それは静かに失敗します)、それで私たちは農民の死体を安全に歩くことができます。

それは醜くてひどいです、しかし:それは毎回動作します。あなたがそれをしなければ、それは機能しません。5Dと7Dに完全に接続するEOSユーティリティのソースコードをリリースするかどうか、キヤノンに何度も尋ねました。彼らは毎回断固として拒否しました。私の同僚は、彼らもクルゲサウルスを使用していることを明らかにしたくないと冗談を言っています。とにかく、私はあなたにその厄介な詳細に頭を上げたかっただけです。

また、カメラとインターフェイスするPythonモジュールを作成しました:http: //github.com/superjoe30/pyedsdk

于 2009-08-05T05:50:59.270 に答える
2

この質問を最初に投稿したのは私です。まだ答えを探している人がここにいることが分かります。最終的に思いついた解決策をブログhttp://www.overridepro.com/2009/06/28/canon-sdk-live-view/に投稿しました。

于 2010-10-15T14:28:57.853 に答える
0

ここにコード サンプルがあり、それを達成するためのさまざまな方法についての議論があります。

于 2009-05-25T16:12:24.933 に答える