gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:29 25 4
gpt4 key购买 nike

我在 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 或 Host
  • 设置容量
  • 使用 EdsSetObjectEventHandler 订阅对象事件
  • 拍照
  • 对象事件应该以“inEvent”为“kEdsObjectEvent_DirItemRequestTransfer”触发
  • 下载数据:
    • 使用 EdsGetDirectoryItemInfo 获取信息,其中“inDirItemRef”是来自事件的“inRef”
    • 使用 EdsCreateFileStream 创建文件流
    • 使用 EdsDownload 下载数据(来自事件的 inRef,来自 DirectoryItemInfo 的大小)
    • 使用 EdsDownloadComplete 标记为已完成(来自事件的引用)
    • 使用 EdsRelease 发布数据(来自事件的引用)
    • 使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com