佳能 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
。对于带有 EdsGetChildCount
和 EdsGetChildAtIndex
的 inRef
,如果它是一个文件夹,您可以使用卷引用或目录项引用(检查 EdsDirectoryItemInfo
结构的 isFolder
字段).
- 要像以前一样下载文件,请使用
EdsDownload
和 EdsCreateMemoryStream
使用
方法在实时取景操作中获取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
。对于带有EdsGetChildCount
和EdsGetChildAtIndex
的inRef
,如果它是一个文件夹,您可以使用卷引用或目录项引用(检查EdsDirectoryItemInfo
结构的isFolder
字段). - 要像以前一样下载文件,请使用
EdsDownload
和EdsCreateMemoryStream