WIA

WIA

WIA 是 Windows Image Acquisition 的簡稱,是一個圖形處理軟體。

基本介紹

  • 中文名:WIA
  • 外文名:Windows Image Acquisition
  • 啟用設備:掃瞄器和數位相機
  • 當前可用版本:WIA 1.0
Windows圖像採集,關於 WIA,WIA 架構,使用WIA,後注,工業無線網路WIA,簡介,技術體系,技術特徵,技術優勢,

Windows圖像採集

Windows 圖像採集 (WIA) 是最新 imaging 技術,在Microsoft Windows Millennium Edition中引入, 包含在更高版本的 MicrosoftWindows 作業系統中(例如WindowsXP,注意Win NT3,Win NT 4 和Windows2000不支持WIA)。 WIA 提供廣泛的支持以啟用 imaging 設備, 如掃瞄器和數位相機, 以與圖像應用程式 (例如, MicrosoftPicture2000和 Adobe Photoshop)對接。
WIA之前的成像設備行業標準是TWAIN標準。
使用WIA,製造商只需要寫 WIA microdriver 以允許設備使用。 這類似於列印製造商提供 minidriver, 而其他WIA組件由作業系統實現。
使用WIA, 獨立硬體供應商 (IHV) 可集中編寫代碼以提高設備功能。
WIA和TWAIN的關係是,WIA是微軟作業系統的影像獲取體系結構,屬於Windows作業系統驅動程式類;而TWAIN是開放協定,用來解決套用軟體對不同影像外設的可移植性調用。應當說,WIA是驅動層上的東西,它為應用程式提供SDK接口;而TWAIN協定在驅動程式和應用程式間提供一個公用接口。TWAIN的層次高於WIA。

關於 WIA

WIA 是 Windows Image Acquisition 的簡稱,當前可用版本是 WIA 1.0,它是 Windows Millennium Edition (Windows Me) 或者更高版本的 Windows 系統中提供的數字圖像獲取服務,同時它也能用於管理數字圖像設備。
WIA 接口既是應用程式接口(WIA API),又是設備驅動程式接口(WIA DDI),下面要講述的都是有關 WIA API 的內容。
通過 WIA API,應用程式可以:
◆運行在強壯穩定的環境中;
◆最大可能地減少協同配合問題;
◆枚舉可用的圖像獲取設備;
◆同時連線多個設備;
◆用標準的、可擴展的方式查詢設備屬性;
◆用標準的、高性能的傳送機制獲取數據;
◆在數據傳送過程中維持圖像屬性;
◆獲取大量的設備事件通知訊息。

WIA 架構

WIA 是使用進程外(Out of process)服務實現的 COM 組件,和大多數進程外服務程式不同的是,WIA 通過提供自己的數據傳送機制(IWiaDataTransfer 接口),避免了圖像數據傳送過程中的性能損失。高性能的 IWiaDataTransfer 接口使用共享記憶體來傳送數據給客戶程式。
WIA 有三個主要的組件:Device Manager,Minidriver Service Library 和 Device Minidriver。
◆Device Manager: 枚舉圖像設備,獲取設備屬,為設備建立事件和創建設備對象;
◆Minidriver Service Library: 執行所有設備無關的服務;
◆Device Minidriver 解釋映射: WIA 屬性和命令到特定的設備。

使用WIA

1.選擇設備
應用程式既可以用 WIA 內置的對話框來選擇設備,也可以不使用 WIA 的用戶界面。
下面的程式將彈出一個 WIA 選擇設備對話框:
#include #pragma comment (lib, "WiaGuid.lib") int WINAPI WinMain(                    HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR lpCmdLine,                     int nCmdShow) {     HRESULT hResult;     IWiaItem *pItemRoot;     IWiaDevMgr *pWiaDevMgr;     CoInitialize(NULL);     __try     {         // Create WIA Device Manager instance         pWiaDevMgr = NULL;         hResult = CoCreateInstance(                                    CLSID_WiaDevMgr,                                     NULL,                                     CLSCTX_LOCAL_SERVER,                                     IID_IWiaDevMgr,                                     (void**) &pWiaDevMgr);         if (hResult != S_OK)         {             MessageBox(                        NULL,                         "Error: CoCreateInstance().",                         NULL,                         MB_ICONSTOP);             __leave;         }         // Display a WIA select device dialog         pItemRoot = NULL;         hResult = pWiaDevMgr->SelectDeviceDlg(                                                NULL,                                                 0,                                                 WIA_SELECT_DEVICE_NODEFAULT,                                                 NULL,                                                 &pItemRoot);          // User canceled         if (hResult == S_FALSE)         {             MessageBox(NULL, "User canceled.", NULL, MB_ICONINFORMATION);             __leave;        }         // No device available         else if (hResult == WIA_S_NO_DEVICE_AVAILABLE)         {             MessageBox(                        NULL,                         "No device available.",                         NULL,                         MB_ICONINFORMATION);             __leave;          } // OK, Then ..........      }      __finally      { // Release COM interface.          if (pItemRoot)              pItemRoot->Release();          if (pWiaDevMgr)              pWiaDevMgr->Release();          CoUninitialize();       }      return 0; }
2.獲取圖像到檔案中
   WIA 獲取圖像非常簡單,直接調用 IWiaDevMgr::GetImageDlg(),它集成了 Select Device 和 Select Image 對話框,在傳送圖像的時候還會自動出現一個進度指示對話框,下面是一個例子:
// ...// Create WIA Device Manager object.hResult = CoCreateInstance(                            CLSID_WiaDevMgr,                             NULL,                             CLSCTX_LOCAL_SERVER,                             IID_IWiaDevMgr,                             (void**) &pWiaDevMgr);if (hResult == S_OK){     // Get a image.    hResult = pWiaDevMgr->GetImageDlg(                                        hWnd,                                         0,                                         WIA_DEVICE_DIALOG_SINGLE_IMAGE,                                         WIA_INTENT_MAXIMIZE_QUALITY,                                         NULL,                                         wszFilename,                                         &guidFormat);    // ...... }// ......
不過由於 IWiaDevMgr::GetImageDlg() 是以圖片檔案的形式返回數據的,有的時候並不能滿足我們的需要,這時候我們就需要使用 IWiaDataTransfer 接口來傳送圖片。
3.獲取記憶體中的圖像數據
在 IWiaDevMgr::SelectDeviceDlg() 之後,可以用它返回的 RootItem 對象的 IWiaItem::DeviceDlg() 方法顯示一個對話框瀏覽 WIA 設備中圖片,請看下面的例子:
// ......// Display a WIA dialog box to the user to prepare for image acquisition.hResult = pRootItem->DeviceDlg(                hWnd,                 0,                                 WIA_INTENT_MAXIMIZE_QUALITY,                                 &cItem,                                 &ppWiaItems);if (hResult == S_OK){     for (i = 0; i < cItem; i++)    {         // ......        // ppWiaItems[i]     } }// ......
IWiaItem::DeviceDlg() 返回選取的圖片總數和每個圖片的 WiaItem 指針,我們可以用用 IWiaDataTransfer 接口來傳送圖片。在傳送每個 WiaItem 數據之前,應該先調用 IID_IWiaPropertyStorage 接口設定相應的屬性:
// ......// Get the IWiaPropertyStorage interface so we can set required properties.hResult = pWiaItem->QueryInterface(                                    IID_IWiaPropertyStorage,                                     (void**) &pWiaPropertyStorage);if (hResult == S_OK){     // Prepare PROPSPECs and PROPVARIANTs     // for setting the media type and format.    psPropSpec[0].ulKind = PRSPEC_PROPID;    psPropSpec[0].propid = WIA_IPA_FORMAT;    psPropSpec[1].ulKind = PRSPEC_PROPID;    psPropSpec[1].propid = WIA_IPA_TYMED;    guidOutputFormat = WiaImgFmt_MEMORYBMP;    pvPropVariant[0].vt = VT_CLSID;    pvPropVariant[0].puuid = &guidOutputFormat;    pvPropVariant[1].vt = VT_I4;    pvPropVariant[1].lVal = TYMED_CALLBACK;    // Set the properties.    hResult = pWiaPropertyStorage->WriteMultiple(              sizeof(pvPropVariant) / sizeof(pvPropVariant[0]),                psPropSpec,               pvPropVariant,               WIA_IPA_FIRST);    // ...... }// ......
如果用 IWiaDataTransfer 接口傳送數據,我們還需要自己寫代碼實現 IWiaDataCallback 接口,其中在我們的 IWiaDataCallback::BandedDataCallback() 中可以接收到數據,例如:
// Recieve data transfer status notifications.HRESULT CALLBACK CWiaDataCallback::BandedDataCallback( LONG lMessage,  LONG lStatus,  LONG lPercentComplete,  LONG lOffset,  LONG lLength,  LONG lReserved,  LONG lResLength,  BYTE *pbData){     PWIA_DATA_CALLBACK_HEADER pHeader = NULL;    switch (lMessage)    {     case IT_MSG_DATA_HEADER:    // The data header contains the image's final size.        pHeader = (PWIA_DATA_CALLBACK_HEADER) pbData;        if ((pHeader) && (pHeader->lBufferSize))        {             // Save the buffer size.            m_nBufferLength = pHeader->lBufferSize;            // Allocate a block of memory to hold the image.            m_pBuffer = (PBYTE) HeapAlloc(                                            GetProcessHeap(),                                             0,                                             m_nBufferLength);            if (m_pBuffer == NULL)                return S_FALSE;         }        break;    case IT_MSG_DATA:        // Make sure a block of memory has been created.        if (m_pBuffer)        {             // Copy the new band.            CopyMemory(m_pBuffer + lOffset, pbData, lLength);            // Increment the counter.            m_nBytesTransfered += lLength;         }        break;    case IT_MSG_TERMINATION:        // Notify that we complete to recive a image.        break;    default:        break;     }    return S_OK; }
然後,我們就可以用 IWiaDataTransfer 接口來傳送數據了:
// ...// Create our callback class.pCallback = new CWiaDataCallback(hWnd);if (pCallback){     // Get the IWiaDataCallback interface from our callback class.    hResult = pCallback->QueryInterface(                                        IID_IWiaDataCallback,                                         (void**) &pWiaDataCallback);    if (hResult == S_OK)    {         // Perform the transfer.        wdtiTransferInfo.ulSize = sizeof(WIA_DATA_TRANSFER_INFO);        hResult = pWiaDataTransfer->idtGetBandedData( &wdtiTransferInfo,  pWiaDataCallback);        // ......     }    // ...... }// ......
三、後話
WIA 是 Windows ME 及其以後的作業系統中提供的,Windows 98/2000 均不支持 WIA,因此需要在較新版本的 MSDN Library 中才有 WIA 文檔。
WIA 1.0 在 MSDN 的文檔地址是:MSDN Library -> 圖形和多媒體 -> Windows 圖像獲取 -> WIA 1.0
另外,因為 Visual C++ 6.0 中沒有 WIA 庫,所以需要使用 Visual Studio DoNET 2002/2003 編譯 WIA 程式。

後注

WIA 是 Windows ME 及其以後的作業系統中提供的,Windows 98/2000 均不支持 WIA,因此需要在較新版本的 MSDN Library 中才有 WIA 文檔。
另外,因為 Visual C++ 6.0 中沒有 WIA 庫,所以需要使用 Visual Studio 2002/2003 編譯 WIA 程式。
最後得提到的是WIA的架構主件主要有:
①掃瞄器和照相機嚮導
②windows資源管理器用戶界面
③WIA設備
④分類安裝程式
⑤腳本接口
⑥TWAIN數據源管理程式和兼容性驅動程式
⑦通用系統對話框對象
⑧設備對象
⑨WIA設備管理程式

工業無線網路WIA

簡介

工業無線網路WIA(Wireless Networks for Industrial Automation)技術是由中科院瀋陽自動化所推出的具有自主智慧財產權的高可靠、超低功耗的智慧型多跳無線感測器網路技術,該技術提供一種自組織、自治癒的智慧型Mesh網路路由機制,能夠針對套用條件和環境的動態變化,保持網路性能的高可靠性和強穩定性。
工業無線網路WIA技術基於短程無線通信IEEE 802.15.4標準,使用符合中國無線委會規定的自由頻帶,解決工廠環境下遍布的各種大型器械、金屬管道等對無線信號的反射、散射造成的多徑效應,以及馬達、器械運轉時產生電磁噪聲對無線通信的干擾,提供能夠滿足工業套用需求的高可靠、實時無線通信服務。
通過使用工業無線網路WIA技術,用戶可以以較低的投資和使用成本實現對工業全流程的“泛在感知”,獲取傳統由於成本原因無法線上監測的重要工業過程參數,並以此為基礎實施最佳化控制,來達到提高產品質量和節能降耗的目標。
工業無線網路WIA技術主要套用於石油、石化、冶金、環保、污水處理等領域。

技術體系

工業無線網路WIA技術體系是由中國工業無線聯盟推出的具有自主智慧財產權的技術體系,形成了國家標準草案,並與Wireless HART、ISA100並列為主流的工業無線技術體系。
WIA網路採用星型和Mesh結合的兩層網路拓撲結構。第一層是Mesh結構,由網關設備及路由設備構成;第二層是星型結構,由路由設備及終端設備或手持設備構成。
網關:負責WIA網路與工廠內的其它網路的協定轉換與數據映射;
冗餘網關:負責網關的熱備份;
網路管理者:負責構建由路由設備構成的Mesh網路;監測全網性能;
安全管理者:負責路由設備及終端設備的密鑰管理與安全認證;
WIA網路的協定棧結構遵循ISO/OSI的層次結構,但只定義了物理層、數據鏈路層、網路層、套用層。
WIA協定棧由協定層實體,包括數據鏈路層、網路層、套用層(由套用支持子層、用戶套用進程、設備管理套用進程構成)、功能模組及層實體間的數據接口和管理接口構成。數據鏈路層、網路層和套用支持子層包含的功能模組有:數據實體和管理實體。用戶套用進程包含的功能模組是多個用戶套用對象。設備管理套用進程包含的功能模組有:設備管理模組、網路管理模組、安全管理模組、網路管理代理模組、安全管理代理模組、管理信息庫。

技術特徵

WIA網路採用了以下措施保障工業環境中無線通信的高可靠性:
1)TDMA避免了報文衝突
系統產用全網TDMA模式,並且全網的時間同步精度達到微秒級。
2)跳頻通信方式提高了點到點通信的抗干擾能力
WIA技術使用多信道進行通信,通過TDMA/CSMA混合接入模式支持周期性和非周期性通信負載,在DSSS的基礎上引入FHSS的思想,採用根據信道狀態自適應跳頻機制,可以有效地抑制突發性干擾,消除頻率選擇性衰減。
3)自動請求重傳保證了報文傳輸的成功率
WIA技術在鏈路層採用自動請求重傳機制,保證了點到點的報文傳輸成功率,在套用層採用面向連線的(connection-oriented)數據傳輸技術,通過端到端的重傳機制保證數據傳輸的高可靠性。
4)Mesh路由提高了端到端通信的可靠性
WIA技術在網路層採用智慧型的Mesh網路技術。每個設備至少有兩條可用的通信路徑,設備加入網路後,可以自主選擇或由網路管理者分配多條數據傳輸路徑。當一條路徑由於干擾被中斷,設備可以自動切換到其它通信質量較好的路徑。
5)設備冗餘提高了系統的魯棒性。

技術優勢

WIA技術與國外同類技術相比較具有的技術優勢主要有以下幾點:
1)分層的組織模式,對網路拓撲的維護更加靈活、快速;
2)自適應的跳頻模式與自動重傳機制,對保障通信的可靠性更加有效;
3)支持網內報文聚合,有效地降低了網路開銷,延長電池壽命;
4)兼容IEEE802.15.4標準,可以使用現有商用器件,易於實現;
5)兼容無線HART標準,支持HART命令,很容易升級傳統儀表,為其增添無線通信功能;
6)用戶可以方便地使用、管理,無需較高的專業知識。

相關詞條

熱門詞條

聯絡我們