佳能 EOS SDK 将拍摄的照片直接下载到缓冲区或流中

Canon EOS SDK download taken picture directly to a buffer or stream

使用

方法在实时取景操作中获取Image非常简单
EdsDownloadEvfImage(CameraRef, ImageRef);

这对于执行进一步的图像处理(使用 OpenCV 等)非常方便

同理,我想获取拍照时的图像数据。在文档中,我只能找到一种使用

将图像下载到PC的方法
EdsError EdsDownload(EdsDirectoryItemRef inDirItemRef, EdsUInt64 inReadSize, EdsStreamRef OutStreamRef)

有什么方便的方法可以直接将拍摄的图像加载到流或缓冲区中吗?

没有,但也不难做到。因为获取图像的方式不止一种,不可能像下载实时取景图像那么简单。

如果想在拍摄后直接获取图像,请执行以下操作:

  • SaveTo 属性 设置为 Host 并收听 ObjectEvent.
  • 一旦事件以 DirItemRequestTransfer 事件类型触发,您可以使用 EdsGetDirectoryItemInfo
  • 获取必要的信息
  • 使用 EdsCreateMemoryStream
  • 创建内存流
  • 用你之前得到的 EdsDirectoryItemInfo 调用 EdsDownload 而对于 inReadSize 你只需使用所述结构中的 size 字段(如果你想使用更小的块和进度事件,查看文档了解更多信息)。
  • 下载完成后,一定要调用EdsDownloadComplete当然要释放一切

如果您不打算下载图像,您必须调用 EdsDownloadCancel,否则相机会将图像保留在缓冲区中,缓冲区将填满并阻止相机关闭(您将必须取出电池才能强制关闭)。

如果你想下载一张保存在相机内存卡上的图片,这就有点复杂了,因为你首先要遍历目录结构才能找到你想要的图片。我不会详述全部细节,您最好阅读相关文档,但这里是粗略的步骤:

  • 通过EdsGetChildCount获取相机的卷数,其中inRef是相机
  • 使用 EdsGetChildAtIndex 循环遍历卷(再次使用相机 inRef)和 EdsGetVolumeInfo
  • 然后基本上一遍又一遍地做同样的事情,但使用 EdsGetDirectoryItemInfo 而不是 EdsGetVolumeInfo。对于带有 EdsGetChildCountEdsGetChildAtIndexinRef,如果它是一个文件夹,您可以使用卷引用或目录项引用(检查 EdsDirectoryItemInfo 结构的 isFolder 字段).
  • 要像以前一样下载文件,请使用 EdsDownloadEdsCreateMemoryStream