[英]How to set/get properties of pictures taken with canon EDSDK 2.12?
SDK文档中对此进行了描述,可能对您来说有点晚,但对其他人可能会有帮助。
要创建事件处理程序,您需要在具有摄像机参考并打开会话后的一段时间内执行以下操作:
Err = EdsSetObjectEventHandler( Camera, kEdsObjectEvent_All, HandleAllObjectEvents, NULL);
为了响应佳能SDK对对象事件的回调(即在HandleAllObjectEvents函数中),您可以执行以下操作:
switch ( inEvent ) {
case kEdsObjectEvent_DirItemCreated:
// new file created on camera card
EdsDirectoryItemRef fileNameRef;
EdsDirectoryItemRef folderNameRef;
EdsDirectoryItemInfo fileNameInfo;
EdsDirectoryItemInfo folderNameInfo;
fileNameRef = (EdsDirectoryItemRef)inObject;
EdsGetDirectoryItemInfo( fileNameRef, &fileNameInfo ); // got the file name and some other info
EdsGetParent( fileNameRef, &folderNameRef );
EdsGetDirectoryItemInfo( folderNameRef, &folderNameInfo ); // got the folder name
char fname[100];
strcpy( fname, folderNameInfo.szFileName );
strcat( fname, "\\" );
strcat( fname, fileNameInfo.szFileName );
如您所知,如果要拍摄大量照片,获取文件夹名称非常重要,因为文件名将从IMG_9999.jpg移到IMG_0000.jpg,并且文件会放入新文件夹(例如,从100CANON到101CANON。使用文件名不能保证名称唯一。
我可以想到几种解决方案。
Windows有一个API( FindFirstChangeNotification
和FindNextChangeNotificaton
),可让您检测目录中的更改。 只需使用相机在计算机上所代表的“驱动器”,即“我想从中看到通知的位置”。 我从未在Mac上进行过编程,但是它似乎有一个名为FSEvents的东西,可以做类似的事情。
您可以依靠相机以一致的名称存储图像。 当应用程序启动时,在驱动器中找到相机的最后一个文件。 然后只需将其编号为“ IMG_0991.JPG”(如果使用RAW模式,将“ JPG”替换为“ CR2”)将变为“ IMG_0992.JPG”。 这一直都在起作用。 当您拍摄了10000张图像后,它最终将环绕到“ IMG_0001.JPG”(它可能会移动到名为“ DCIM / 101CANON”的新目录,而不是“ DCIM / 100CANON”)。
扫描目录并保留所有文件的列表。 然后再次扫描。 如果有很多图像,这可能需要一些时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.