複製鏈接
請複製以下鏈接發送給好友

WIA

鎖定
WIA(Windows Image Acquisition的簡稱),是一個圖形處理軟件,是微軟操作系統的影像獲取體系結構,屬於Windows操作系統驅動程序類。
中文名
WIA
外文名
Windows Image Acquisition
啓用設備
掃描儀和數碼相機
當前可用版本
WIA 1.0

WIAWindows圖像採集

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

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

WIAWIA 架構

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使用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後注

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

WIA簡介

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

WIA技術體系

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

WIA技術特徵

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

WIA技術優勢

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