2011-07-31 20 views
4

数日のうちに、カメラから撮影した画像を取得しようとしました。今日私は見つけたEDSDKで写真を撮影してすぐに取得する

EdsSetPropertyData(cRef, PropID_SaveTo, 0, 4, 2); 

これはカメラに画像を保存しません。しかし、私の問題は現在、私はカメラから画像を取得できないということです。私のObjectEventHandlerは決して呼び出されません(時には初期化時に前のピクチャに呼び出されることがあります)。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using EDSDKLib; 

namespace CCCBSv2 
{ 
class CC : EDSDK 
{ 
    IntPtr cRef; 

    // Initilizes, takes picture and uninitilizes 
    public void RunSeq() 
    { 
     uint err; 
     err = Initialize(); 
     if (err != EDS_ERR_OK) 
     { 
      return; 
     } 
     err = TakePicture(); 
     if (err != EDS_ERR_OK) 
     { 
      return; 
     } 
     Uninitilize(); 
    } 

    public uint Initialize() 
    { 
     // err init 
     uint err; 
     // Initilize SDK. 
     // SDK initilizion is needed to use EDSDK functions 
     err = EdsInitializeSDK(); 

     // In case of error pass it on... 
     if (err != EDS_ERR_OK) 
     { 
      return err; 
     } 

     // get first camera connected to computer 
     err = GetFirstCamera(); 

     if (err != EDS_ERR_OK) 
     { 
      return err; 
     } 

     // Open session to camera 
     EdsOpenSession(cRef); 

     // Set object event handler, We need this event handler to retrieve pictures from camera 
     err = EdsSetObjectEventHandler(cRef, ObjectEvent_All, ObjectEventHandler, IntPtr.Zero); 

     if (err != EDS_ERR_OK) 
     { 
      return err; 
     } 

     // We don't want to save pictures to the camera so lets set save target to host 
     err = EdsSetPropertyData(cRef, PropID_SaveTo, 0, 4, 2); 

     return err; 
    } 

    // uninitilizes edsdk 
    public uint Uninitilize() 
    { 
     uint err; 
     err = EdsCloseSession(cRef); 
     if (err != EDS_ERR_OK) 
     { 
      return err; 
     } 
     err = EdsTerminateSDK(); 

     return err; 
    } 

    // gets the first camera to cRef 
    private uint GetFirstCamera() 
    { 
     // Variable initilazions 
     IntPtr cameraList; 
     uint err; 
     int count; 

     // Get list of cameras; 
     err = EdsGetCameraList(out cameraList); 

     if (err != EDS_ERR_OK) 
     { 
      return err; 
     } 

     // Get count of cameras in list 
     err = EdsGetChildCount(cameraList, out count); 

     if (err != EDS_ERR_OK) 
     { 
      return err; 
     } 
     if (count == 0) 
     { 
      return EDS_ERR_DEVICE_NOT_FOUND; 
     } 

     // Get first camera to public cRef 
     err = EdsGetChildAtIndex(cameraList, 0, out cRef); 

     if (err != EDS_ERR_OK) 
     { 
      return err; 
     } 

     // release camera list 
     if (cameraList != null) 
     { 
      EdsRelease(cameraList); 
     } 

     // everything went just fine 
     return EDS_ERR_OK; 
    } 

    public uint ObjectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext){ 
     switch (inEvent) 
     { 
      // in case of a download request 
      case ObjectEvent_DirItemRequestTransfer: 
       DownloadImage(inRef); 
       break; 
      default: 
       break; 
     } 
     return EDS_ERR_OK; 
    } 

    // Downloads the picture from camera's buffer to the computer 
    private uint DownloadImage(IntPtr dItem) 
    { 

     EdsDirectoryItemInfo dirInfo; 
     uint err; 
     IntPtr stream = new IntPtr(); 
     err = EdsGetDirectoryItemInfo(dItem, out dirInfo); 

     if (err == EDS_ERR_OK) 
     { 
      err = EdsCreateFileStream(dirInfo.szFileName, EdsFileCreateDisposition.CreateAlways, EdsAccess.ReadWrite, out stream); 
     } 
     if (err == EDS_ERR_OK) 
     { 
      err = EdsDownload(dItem, dirInfo.Size, stream); 
     } 
     if (err == EDS_ERR_OK) 
     { 
      err = EdsDownloadComplete(dItem); 
     } 
     if (stream != null) 
     { 
      EdsRelease(stream); 
     } 
     return err; 
    } 

    // Takes picture 
    public uint TakePicture() 
    { 
     return EdsSendCommand(cRef, CameraCommand_TakePicture, 0); 
    } 
} 
} 
+0

Canon.EOS.Frameworkでカメラのプロパティを設定する方法は? –

答えて

0

私の最初の推測では、あなたがコールバックする前に、あまりにも速くドライバの初期化を解除することをある

Camera camera = new Camera(); 
Thread thread = new Thread(new ThreadStart(camera.DoThings)); 
thread.Start(); 

そして、ここに私のCCクラス(カメラ制御)である: はここ(メイン機能で)私の発信者でありますトリガされる機会があります。

TakePictureはカメラに写真を撮るように指示し、瞬時に戻ってドライバを初期化します。しかし、実際に写真を撮るには、機械部品を動かすことが必要で、永遠に半分かかるかもしれません。カメラが完了したことを知らせるまでに、メッセージを受け取るリスナーはもういません。

2

私はCanon EOSサポートをより良く機能させるために取り組んでいます。私はそれをCanon.Eos.Frameworkと呼ぶ。私はちょうどtaking pictures and downloading them any path on your compuuterのサポートを追加しました。このフレームワークはまだアルファモードですが、自由にテストすることができます。

+0

Halo @スカ。私は今あなたの枠組みを試しています。私はあなたに結果を知らせます。ありがとう! – swdev

+0

ライブビューに問題があります:) – swdev

3

イベントを取得して送出するには、Windowsのメッセージループが必要です。あなたはmain()にこれを追加した後、オブジェクトのイベントハンドラが呼び出されなければなりません。

while(GetMessage(&msg, NULL, NULL, NULL)) 
{   
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

また、SaveTo_HostにPropID_SaveToを設定することを忘れないでください。あなたは私の投稿hereを見ることができます。

関連する問題