【问题标题】:canon EDSDK saving image in my PC佳能 EDSDK 在我的电脑中保存图像
【发布时间】:2014-04-09 14:39:43
【问题描述】:

我在我的 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();

相机快门正常触发,我在相机的存储卡中找到图片,但在我的电脑中找不到。

请帮忙。

【问题讨论】:

    标签: c++ edsdk canon-sdk


    【解决方案1】:

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

    • 打开会话
    • 设置 SaveTo_Both 或 Host
    • 设置容量
    • 使用 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);
    }
    

    【讨论】:

    • 其实我是 EDSDK 新用户,所以我认为代码示例会有所帮助(即使在 c# 中)。提前致谢
    • 图像应位于程序旁边。如果您需要不同的路径,您可以在 EdsCreateFileStream 行中添加“dirItemInfo.szFileName”的路径。如果这不起作用,您是否收到任何错误?
    • @user3510821 您是否每行都检查“err”变量?不会有异常,它只是返回一个错误值。下载需要一点时间,是的,但 3 秒应该没问题。如果不是,“SendCommand”的返回值将类似于“设备忙”
    • @DavidGidony 您可以使用 ImageQuality 属性设置图像大小。容量命令与它无关。设置容量只会告诉 SDK PC 驱动器上还剩多少空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多