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

时间:2014-04-09 14:39:43

标签: c++ edsdk canon-sdk

我正在使用EDSDK v2.13和我的EOS 50D相机。 我想在我的主人中保存拍摄的照片。我正在使用此代码(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 个答案:

答案 0 :(得分:6)

它不起作用。拍摄照片后,您需要捕获ObjectEvent然后下载文件。它的工作原理如下:

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

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

亲切的问候

修改

好的,在文档的帮助下,一些C ++代码: 请注意,这是它最简单的形式。你应该经常检查是否错误!= 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);
}