2010-11-30 4 views
2

J'ai essayé de récupérer des images prises sur l'appareil photo depuis très longtemps maintenant. Je suis capable de prendre des photos avec le SDK en utilisant:Récupération d'images de l'appareil photo Canon à l'aide d'EDSDK 2.9

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

Je le fais après avoir ouvert une session de caméra valide. J'ai aussi ajouté un

objectEventHandler et un stateEventHandler pour les événements qui ressemblent à:

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; 
    } 

J'ai essayé plusieurs approches (pour récupérer cette image) aucun d'entre eux ne semble fonctionner . Certaines approches sont:

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 -8]

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

la chose est tous ne sont qu'une partie du code , quand j'essaie de le mettre dans le mien, ça ne fonctionne jamais correctement. Probablement parce que je ne suis pas experte t sur memoryStreams, pointeurs un tel. La plupart des erreurs que je reçois sont lors de la lecture des flux et de les copier dans un tampon local, il dit que le flux est vide.

Est-ce que quelqu'un a un code d'échantillon complet pour prendre une photo et la télécharger sur le disque (ou la mémoire), ou l'approche correcte dont j'ai besoin pour compléter cela?

Merci Fernando

+1

seriez-vous prêt à passer en C++? – rossb83

Répondre

0

télécharger l'image de capture dans un disque dur sous forme de fichier, vous pouvez le vérifier

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

l'erreur dans votre code est:

downloadImage(inContext); 

il se doit être

downloadImage(inRef); 
Questions connexes