0

使用该方法在实时取景操作中很容易获得图像

EdsDownloadEvfImage(CameraRef, ImageRef);

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

同样,我想获取拍照时的图像数据。在文档中,我只能找到一种将图像下载到 PC 的方法

EdsError EdsDownload(EdsDirectoryItemRef inDirItemRef, EdsUInt64 inReadSize, EdsStreamRef OutStreamRef)

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

4

1 回答 1

1

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

如果要拍完后直接获取图像,请执行以下操作:

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

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

如果要下载保存在相机存储卡上的图像,它会变得有点复杂,因为您首先必须遍历目录结构才能找到所需的图像。我不会详细介绍,您最好阅读文档,但这里是粗略的步骤:

  • 获取相机的卷数以及相机在EdsGetChildCount哪里inRef
  • 循环使用EdsGetChildAtIndex(再次使用相机inRef)和EdsGetVolumeInfo
  • 然后基本上一遍又一遍地做同样的事情,但使用EdsGetDirectoryItemInfo而不是EdsGetVolumeInfo. 对于inRefwith EdsGetChildCountEdsGetChildAtIndex如果它是一个文件夹,您可以使用卷引用或目录项引用(检查结构的isFolder字段EdsDirectoryItemInfo)。
  • 要像以前一样下载文件,请使用EdsDownloadEdsCreateMemoryStream
于 2020-07-13T14:09:43.790 回答