佳能 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 在我的电脑中保存图像的主要内容,如果未能解决你的问题,请参考以下文章
佳能数字 SDK (EDSDK) EdsCreateImageRef 错误