2010-11-30 5 views
2

나는 매우 오랜 시간 동안 카메라에서 찍은 이미지를 검색하려고했습니다. SDK를 사용하여 사진을 찍을 수 있습니다 :EDSDK 2.9를 사용하여 Canon 카메라에서 사진 가져 오기

err = EDSDK.EdsSendCommand (cameraDev, EDSDK.CameraCommand_TakePicture, 0);

유효한 카메라 세션을 연 후에 이렇게합니다. 나는 (이 이미지를 검색하는) 그들 중 누구도 제대로 작동하지 여러 방법을 시도

public static uint stateEventHandler(uint inEvent, uint inParameter, IntPtr inContext) 
    { 
     switch (inEvent) 
     { 
      case EDSDK.StateEvent_JobStatusChanged: 
       Debug.WriteLine(String.Format("There are objects waiting to be transferred. Job status {0}", inParameter)); 
       break; 

      case EDSDK.StateEvent_ShutDownTimerUpdate: 
       if (inParameter != 0) 
        Debug.WriteLine(String.Format("shutdown timer update: {0}", inParameter)); 
       break; 

      default: 
       Debug.WriteLine(String.Format("StateEventHandler: event {0}, parameter {1}", inEvent, inParameter)); 
       break; 
     } 
     return 0; 
    } 

public static uint objectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext) 
    { 
     switch (inEvent) 
     { 
      case EDSDK.ObjectEvent_VolumeInfoChanged: 
       Debug.WriteLine("volume info changed"); 

       #region retrieve volume info 

       EDSDK.EdsVolumeInfo volumeInfo; 
       err = EDSDK.EdsGetVolumeInfo(inRef, out volumeInfo); 
       if (err == EDSDK.EDS_ERR_OK) 
       { 
        switch (volumeInfo.StorageType) 
        { 
         case (uint)EDSDK.EdsStorageType.Non: 
          Debug.WriteLine("No card inserted"); 
          break; 
         default: 
         case (uint)EDSDK.EdsStorageType.CF: 
         case (uint)EDSDK.EdsStorageType.SD: 
          if (volumeInfo.Access == (uint)EDSDK.EdsAccess.ReadWrite) 
          { 
           Debug.WriteLine(String.Format("Label: {0}, Max Capacity: {1}, Free Space: {2}", 
            volumeInfo.szVolumeLabel, volumeInfo.MaxCapacity, volumeInfo.FreeSpaceInBytes)); 

           /* 
           err = EDSDK.EdsGetChildAtIndex(volumeInfo, 0, directoryList); 
           if (err != EDSDK.EDS_ERR_OK) 
            throw new Exception(String.Format("EdsGetChildAtIndex: " + err.ToString())); 
           */ 
          } 
          else 
           Debug.WriteLine(String.Format("Volume access rights: {0}", volumeInfo.Access)); 
          break; 
        } 
       } 

       #endregion retrieve volume info 

       break; 

      case EDSDK.ObjectEvent_DirItemCreated: 
       downloadImage(inContext); 
       Debug.WriteLine("dir item created"); 
       break; 

      default: 
       Debug.WriteLine(String.Format("ObjectEventHandler: event {0}", inEvent)); 
       break; 
     } 
     return 0; 
    } 

: 나는 또한 같이 이벤트에 대한

objectEventHandler과 stateEventHandler을 추가 한 . 접근 방법의 일부는 다음과 같습니다

http://tech.groups.yahoo.com/group/CanonSDK/message/1575

[http://stackoverflow.com/questions/3762530/take-picture-and-directly-save-image-to-pc-using-edsdk-2 -11]

[http://canonsdk.com/phpBB3/viewtopic.php?f=7 & & t = 94 = SID 7fcbe7ad6eadb399dbcb4b61a7333112]

것은 모두는 단지 코드 부분이고 , 내가 그것을 광산에 넣으려고 할 때 제대로 작동하지 않습니다. 아마도 나는 경험이 없기 때문입니다. memoryStreams에 t, 포인터가 그렇게. 내가 얻는 대부분의 오류는 스트림을 읽고 로컬 버퍼에 복사 할 때 스트림이 비어 있다고 말합니다.

누구나 사진을 찍어 디스크 (또는 메모리)에 다운로드하거나이 작업을 완료하는 데 필요한 견고한 접근법에 대한 전체 샘플 코드가 있습니까?

감사 페르난도

+1

C++로 전환 하시겠습니까? – rossb83

답변

0

파일로 하드 디스크에 캡처 이미지를 다운로드, 당신은 당신의 코드에서

void DownloadImage(IntPtr DirectoryRef) 
{ 
    IntPtr stream = IntPtr.Zero; 

    try 
    { 
     Error = EDSDK.EdsGetDirectoryItemInfo(DirectoryRef, out dirItemInfo); 

     if (Error == OK) 
     { 
      Error = EDSDK.EdsCreateFileStream(dirItemInfo.szFileName, 
      EDSDK.EdsFileCreateDisposition.CreateAlways, EDSDK.EdsAccess.ReadWrite, out stream); 
     } 

     if (Error == OK) 
     { 
      Error = EDSDK.EdsDownload(DirectoryRef, dirItemInfo.Size, stream); 
     } 

     if (Error == OK) 
     { 
      Error = EDSDK.EdsDownloadComplete(DirectoryRef); 
     } 
     else 
     { 
      Error = EDSDK.EdsDownloadCancel(DirectoryRef); 
     } 

     Error = EDSDK.EdsGetPointer(stream, out data); 
     if (Error != OK) 
       throw new Exception("Invalid Pointer Handler. Error Code:" + err.getErrorName(Error) + "(" + Error + ")"); 

     Error = EDSDK.EdsGetLength(stream, out size); 

     Bitmap retImage = null; 
    } 
    catch (Exception ex) 
    { 

    } 

    EDSDK.EdsRelease(stream); 
    EDSDK.EdsRelease(data);    
} 
1

오류를 확인하실 수 있습니다 것은 :

downloadImage(inContext); 

가해야 be

downloadImage(inRef); 
관련 문제