.Net 玩單反的技巧

來源:互聯網
上載者:User
這篇文章分享使用.Net 玩單反

背景

一年多沒逛園子了,換了個行業圈子,感覺自己太花心了點,不過能接觸到不同的研發文化也算有點收穫,遊戲圈子的技術流、電商圈子的業務流、媒體圈子的藝術流等等。

這個應用產生的背景是讓單反相機自動化,本身老大的意思是想做針對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本身是串列的 這裡只是寫著玩 大家不用認真

  新添加相機裝置

程式控制相機拍照

本地載入相機內照片資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.