Acquisire Foto ed Immagini con WIA

WIA è l’acronimo di Windows Image Acquisition ed è stato introdotto fin da Windows ME. Nato per ovviare ai tanti problemi nell’usare il vecchio protocollo TWAIN, oggi è divenuto la base di tutte le periferiche di acquisizione. Il fulcro di questo articolo è spiegare come utilizzarlo nelle nostre applicazioni C/C++, come ad esempio nell’applicazione Vikings I ( software per magazzino ) che sfrutta questa tecnologia per acquisire immagini da inserire nel database.
Innanzitutto affinchè il programma non si blocchi si deve creare un worker thread che faccia tutto il lavoro e vedere quando ha finito con un semaforo:

CWinThread* pThread = AfxBeginThread(AcquireThreadProc, this);
AfxGetMainWnd()->EnableWindow(FALSE);
while (MsgWaitForMultipleObjects(1, &pThread->m_hThread,
     FALSE, INFINITE, QS_ALLINPUT, QS_ALLPOSTMESSAGE) == WAIT_OBJECT_0 + 1)
{
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
    }
}

Ecco il codice per attendere la fine dell’acquisizione, intanto possiamo vedere come deve essere implementato il thread inizializzato come AcquireThreadProc, una semplice funzione CALLBACK statica che deve inizializzare l’oggetto COM ( Component Object Model ) IWiaDevMgr in questo modo:

CoInitialize(NULL);
CComPtr pDev;
HRESULT hr = pDev.CoCreateInstance(CLSID_WiaDevMgr);
if (hr != S_OK)
{
    CoUninitialize();
    return 1;
}

Ultima cosa da fare ed anche la più semplice è richiamare il metodo GetImageDlg dell’oggetto IWiaDevMgr creato prima:

GUID guidFormat = GUID_NULL;
HRESUT hr = pDev->GetImageDlg(((CWnd*)pParam)->m_hWnd,
       StiDeviceTypeDefault, WIA_DEVICE_DIALOG_SINGLE_IMAGE, WIA_INTENT_NONE,
       NULL, szBuffer, &guidFormat);
if (FAILED(hr))
{
    CoUninitialize();
    return 1;
}

Con quest’ultimo metodo abbiamo finito, ma se vogliamo andare più in profondità e gestire nei minimi dettagli l’acquisizione ci sono molti altri metodi dell’oggetto che servono più che atro per personalizzare le varie fasi di questa procedura. Ricordo che possiamo acquisire immagini e foto da scanner, videocamere e tutto quell’hardware compatibile con la tecnologia WIA ( Windows Image Acquisition ).
La nostra ultima applicazione sfrutta proprio questa tecnologia per acquisire immagini ed inserirle nel database dei clienti, fornitori, articoli di magazzino, dipendenti ed altro e la potete trovare sul nostro sito.

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.