0

我是 C++ 编程的初学者,我开始使用 Canon EDSDK 2.12 来远程控制 EOS 600D DSLR。我使用此处的代码来更好地了解如何访问相机并拍摄单张照片,它工作正常但现在我不确定如何继续我的程序,因为我无法弄清楚 SDK 的可能性编程参考。

是否可以使用自定义名称拍摄保存在相机 SD 上的照片?

如果不

如何创建事件处理程序?每次拍摄照片并使用它执行一些其他任务时,我都想获得一个由 SD 上的图像路径(文件夹和图像名称作为唯一 ID)组成的字符串。

我希望这有助于理解我想要做什么。

4

2 回答 2

0

这在 SDK 文档中有所描述,对您来说可能有点晚,但可能对其他人有帮助。

要创建事件处理程序,您需要在获得相机引用并打开会话后的某个时间执行以下操作:

Err = EdsSetObjectEventHandler( Camera, kEdsObjectEvent_All, HandleAllObjectEvents, NULL);

为了响应对象事件的 Canon SDK 回调(即在 HandleAllObjectEvents 函数中),您可以执行以下操作:

switch ( inEvent ) {
    case kEdsObjectEvent_DirItemCreated:
        // new file created on camera card
        EdsDirectoryItemRef fileNameRef;
        EdsDirectoryItemRef folderNameRef;
        EdsDirectoryItemInfo fileNameInfo;
        EdsDirectoryItemInfo folderNameInfo;

        fileNameRef = (EdsDirectoryItemRef)inObject;
        EdsGetDirectoryItemInfo( fileNameRef, &fileNameInfo );  // got the file name and some other info
        EdsGetParent( fileNameRef, &folderNameRef );
        EdsGetDirectoryItemInfo( folderNameRef, &folderNameInfo );  // got the folder name

        char fname[100];
        strcpy( fname, folderNameInfo.szFileName );
        strcat( fname, "\\" );
        strcat( fname, fileNameInfo.szFileName );

如您所知,如果您要拍摄大量照片,获取文件夹名称很重要,因为文件名从 IMG_9999.jpg 滚动到 IMG_0000.jpg,并且文件被放入一个新文件夹(例如从 100CANON 到 101CANON。只需使用文件名并不能保证唯一的名称。

于 2014-02-02T23:14:46.457 回答
-1

我可以想到几种解决方案。

  1. Windows 有一个 API (FindFirstChangeNotificationFindNextChangeNotificaton),允许您检测目录中的更改。只需使用在计算机上表示相机的“驱动器”作为“我想从这里查看通知”。我从来没有在 Mac 上编程过,但它似乎有一个叫做FSEvents的东西可以做类似的事情。

  2. 您可以依靠相机以一致的名称存储图像。当您的应用程序启动时,找到驱动器中作为相机存储的最后一个文件。然后将其编号为“IMG_0991.JPG”[如果您使用 RAW 模式,请将“JPG”替换为“CR2”]将变为“IMG_0992.JPG”。这每次都有效。当您拍摄了 10000 张图像时,它最终会环绕到“IMG_0001.JPG”(它可能会移动到一个名为“DCIM/101CANON”而不是“DCIM/100CANON”的新目录)。

  3. 扫描目录并保留所有文件的列表。然后再次扫描。如果有很多图像,这可能需要一点时间。

于 2013-07-04T08:04:55.847 回答