我在 EOS 50D 相机上使用 EDSDK v2.13。
我想将拍摄的照片保存在我的主机中。我正在使用此代码(C++):

    EdsOpenSession(camera);
    EdsInt32 saveTarget = kEdsSaveTo_Both;
    err = EdsSetPropertyData( camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );

    EdsCapacity newCapacity = {0x7FFFFFFF, 0x1000, 1};
    err = EdsSetCapacity(camera, newCapacity);

  const char* ch_dest = "C:\\photo\\Img.jpg";
  EdsCreateFileStreamEx( ch_dest ,kEdsFileCreateDisposition_CreateNew,kEdsAccess_ReadWrite, 0);

    EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
    EdsCloseSession(camera);
    EdsTerminateSDK();

相机快门正常闪光,我在相机的存储卡中找到了图片,但在我的 PC 中找不到它。

请帮忙。

最佳答案

它不会那样工作。拍完照片后,您需要捕获 ObjectEvent,然后下载文件。它的工作原理是这样的:

  • 打开 session
  • 设置 SaveTo_Both 或主机
  • 设置容量
  • 使用 EdsSetObjectEventHandler 订阅对象事件
  • 拍照
  • 对象事件应在“inEvent”为“kEdsObjectEvent_DirItemRequestTransfer”时触发
  • 下载数据:
  • 使用 EdsGetDirectoryItemInfo 获取信息,其中“inDirItemRef”是来自事件
  • 的“inRef”
  • 使用 EdsCreateFileStream 创建文件流
  • 使用 EdsDownload 下载数据(来自事件的 inRef,来自 DirectoryItemInfo 的大小)
  • 标记为完成 EdsDownloadComplete(来自事件的 inRef)
  • 使用 EdsRelease 发布数据(来自事件的 inRef)
  • 使用 EdsRelease 释放流

  • 很抱歉,我无法为您提供实际代码,我不是 C++ 开发人员。如果您愿意,我可以向您展示一些 C# 代码。要获得有关函数如何工作的更多详细信息,您还可以查看 SDK 的文档。

    亲切的问候

    编辑:

    好的,一些 C++ 代码在文档的帮助下:
    请注意,这是它以最简单的形式工作的方式。您应该始终检查是否 err != EDS_ERR_OK。并且您应该仅在下载图像后调用 Close。
    void TakePhoto()
    {
        EdsError err = EDS_ERR_OK;
        EdsCameraRef camera = NULL;
        EdsCameraListRef cameraList = NULL;
        EdsUInt32 count = 0;
    
        err = EdsInitializeSDK();
        err = EdsGetCameraList(&cameraList);
        err = EdsGetChildCount(cameraList, &count);
        if (count > 0)
        {
            err = EdsGetChildAtIndex(cameraList, 0, &camera);
            cameraList = NULL;
            err = EdsSetObjectEventHandler(camera, kEdsObjectEvent_All, handleObjectEvent, NULL);
            err = EdsOpenSession(camera);
            err = EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
        }
    }
    
    void Close(EdsCameraRef *camera)
    {
        err = EdsCloseSession(camera);
        EdsRelease(camera);
        EdsTerminateSDK();
    }
    
    static EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid * context)
    {
        if (event == kEdsObjectEvent_DirItemRequestTransfer)
        {
            EdsError err = EDS_ERR_OK;
            EdsStreamRef stream = NULL;
            EdsDirectoryItemInfo dirItemInfo;
            err = EdsGetDirectoryItemInfo(object, &dirItemInfo);
            err = EdsCreateFileStream(dirItemInfo.szFileName, kEdsFileCreateDisposition_CreateAlways, kEdsAccess_ReadWrite, &stream);
            err = EdsDownload(object, dirItemInfo.size, stream);
            err = EdsDownloadComplete(object);
            EdsRelease(stream);
            stream = NULL;
        }
        if (object) EdsRelease(object);
    }
    

    关于c++ - 佳能 EDSDK 在我的电脑中保存图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22965982/

    10-11 19:06