佳能 EDSDK 在我的电脑中保存图像

Posted

技术标签:

【中文标题】佳能 EDSDK 在我的电脑中保存图像【英文标题】:canon EDSDK saving image in my PC 【发布时间】: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();

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

请帮忙。

【问题讨论】:

【参考方案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 看看这里:codeproject.com/Articles/688276/Canon-EDSDK-Tutorial-in-Csharp @DavidGidony 您可以使用 ImageQuality 属性设置图像大小。容量命令与它无关。设置容量只会告诉 SDK PC 驱动器上还剩多少空间。

以上是关于佳能 EDSDK 在我的电脑中保存图像的主要内容,如果未能解决你的问题,请参考以下文章

佳能 EDSDK Liveview 的示例 C 代码?

佳能数字 SDK (EDSDK) EdsCreateImageRef 错误

来自佳能 EDSDK EdsInitializeSDK() API 的 EXC_BAD_ACCESS

佳能 LiveView:图像转换为 OpenCV Mat

如何将二进制图像保存为任何格式到我的电脑上

OSX EdsOpenSession exc_bad_access 上的佳能 EDSDK 2.11