背景
一年多没逛园子了,换了个行业圈子,觉得本身太花心了点,不过能接触到差别的研发文明也算有点收成,游戏圈子的手艺流、电商圈子的营业流、媒体圈子的艺术流等等。
这个运用发生的背景是让单反相机自动化,本身老大的意义是想做针对usb接口的编程,不过太底层的手艺用c#来做不是很适宜。斤斤计较了一番,那就针对单反来做吧。
假定一个场景,我们须要N台单反装备对准一朵花,每隔30秒拍一张照片而且自动发到微博上。
手艺点
佳能SDK
WIA规范
佳能sdk供应了dll给.net开发者援用,经由历程对sdk的挪用能够轻易的佳能对应型号的相机,不过关于猎取相机内的数据.net版本 sdk中并没有供应。那末怎样猎取单反相机内的数据就成了一个题目点。有些同砚可能会迷惑,单反相机接入电脑usb插口不就会发生一个盘符么,直接用DriveInfo.GetDrives()猎取盘符遍历不就能够了么。这里先给人人扫盲一下,USB从装备的分类能够从USB装备接口描述符对应的的bInterfaceClass这一个byte获得。 bInterfaceClass的典范代码为1,2,3,6,7,8,9,10,11,255。离别代表意义为1-audio:示意一个音频设 备。2-communication device:通讯装备,如电话,moden等等。3-HID:人机交互装备,如键盘,鼠标等。6-image图象装备,如扫描仪,摄像优等,偶然数码相 机也可归到这一类。7-打印机类。如单向,双向打印机等。8-mass storage海量存储类。一切带有肯定存储功用的都能够归到这一类。如数码相机大多数都归这一类。9-hub类。11-chip card/smart card。255-vendor specific.厂家的自定义类,重要用于一些特别的装备。如接口转接卡等。
我们的driveinfo能够捕获的装备范例为
public enum DriveType { // Summary: // The type of drive is unknown. Unknown = 0, // // Summary: // The drive does not have a root directory. NoRootDirectory = 1, // // Summary: // The drive is a removable storage device, such as a floppy disk drive or a // USB flash drive. Removable = 2, // // Summary: // The drive is a fixed disk. Fixed = 3, // // Summary: // The drive is a network drive. Network = 4, // // Summary: // The drive is an optical disc device, such as a CD or DVD-ROM. CDRom = 5, // // Summary: // The drive is a RAM disk. Ram = 6, }
平常u盘装备都是Removable的,然则单反相机是PortableDevice,用GetDrives要领是猎取不到这类范例的。在windows systems32中供应了一系列针对portabledevice的api要领有兴致的同砚能够尝试下
这里我挑选的是wia接口编程,WIA 是 Windows Image Acquisition 的简称,当前可用版本是 WIA 1.0,它是 Windows Millennium Edition (Windows Me) 或许更高版本的 Windows 体系中供应的数字图象猎取效劳,同时它也能用于治理数字图象装备。WIA 是运用历程外(Out of process)效劳完成的 COM 组件,和大多数历程外效劳顺序差别的是,WIA 经由历程供应本身的数据传送机制(IWiaDataTransfer 接口),避免了图象数据传送历程当中的机能丧失。高机能的 IWiaDataTransfer 接口运用同享内存来传送数据给客户顺序。
WIA 有三个重要的组件:Device Manager,Minidriver Service Library 和 Device Minidriver。
◆Device Manager: 罗列图象装备,猎取装备属,为装备竖立事宜和建立装备对象;
◆Minidriver Service Library: 实行一切装备无关的效劳;
◆Device Minidriver 诠释映照: WIA 属性和敕令到特定的装备。
经由历程DeviceManagerClass().DeviceInfos中的信息 我们能够收集到单反中有属于CameraDeviceType的装备信息,至于视频等其他范例有其他相似要领。
public void DownJpgFromAllCamera() { int i = 1; foreach (IDeviceInfo DevInfo in new DeviceManagerClass().DeviceInfos) { if (DevInfo.Type == WiaDeviceType.CameraDeviceType) { string DeviceID = DevInfo.DeviceID; Device wDevice = DevInfo.Connect(); Devparam dev = new Devparam {wiaDevice=wDevice, DeviceID = DeviceID, index = i }; new Thread((Camera) => { DownJpg(((Devparam)Camera).wiaDevice, ((Devparam)Camera).DeviceID, ((Devparam)Camera).index); } ).Start(dev); i++; } } }
再来谈谈SDK,佳能sdk .net版本中供应5种句柄托付
public delegate uint EdsProgressCallback( uint inPercent, IntPtr inContext, ref bool outCancel); public delegate uint EdsCameraAddedHandler(IntPtr inContext); public delegate uint EdsPropertyEventHandler(uint inEvent, uint inPropertyId, uint inParam, IntPtr inContext); public delegate uint EdsObjectEventHandler( uint inEvent, IntPtr inRef, IntPtr inContext); public delegate uint EdsStateEventHandler( uint inEvent, uint inParameter, IntPtr inContext);
第一个用于数据处理历程比方数据复制、图片保留等。
第二个用于pc发明新的相机装备
第三个用于相机内数据流等属性状况变化的关照,比方照相行动发生的系列变化
第四个用于文件操纵 比方文件建立 删除等等
第五个用于相机本身的状况时候 比方开关机 非常等
种种运用的场景人人参看下demo顺序 虽然load要领开启的是多线程 然则硬盘io本身是串行的 这里只是写着玩 人人不必仔细
效果图
新增加相机装备
顺序控制相机照相
当地加载相机内照片数据
以上就是.Net 玩单反的技能的细致内容,更多请关注ki4网别的相干文章!