Compartir a través de


Transferencia de datos de imagen en WIA 1.0

Nota

Este tutorial trata sobre la transferencia de datos de imagen en aplicaciones que ejecutarán Windows XP o versiones anteriores. Consulta Transferir datos de imagen en WIA 2.0 para obtener información sobre cómo transferir datos de imagen en aplicaciones que se ejecutarán en Windows Vista o versiones posteriores.

 

Usa los métodos de la interfaz IWiaDataTransfer para transferir datos de un dispositivo Windows Image Acquisition (WIA) 1.0 a una aplicación. Esta interfaz admite una ventana de memoria compartida para transferir datos del objeto de dispositivo a la aplicación y eliminar copias de datos innecesarias durante la serialización.

Las aplicaciones deben consultar un elemento de imagen para obtener un puntero a su interfaz IWiaDataTransfer , como en el ejemplo de código siguiente:

    // Get the IWiaDataTransfer interface
    //
    IWiaDataTransfer *pWiaDataTransfer = NULL;
    hr = pWiaItem->QueryInterface( IID_IWiaDataTransfer, (void**)&pWiaDataTransfer );

En el código anterior, se supone que pWiaItem es un puntero válido a la interfaz IWiaItem . La llamada a IUnknown::QueryInterface rellena pWiaDataTransfer con un puntero a la interfaz IWiaDataTransfer del elemento al que hace referencia pWiaItem.

A continuación, la aplicación establece los miembros de estructura STGMEDIUM . Para obtener información, vea STGMEDIUM y TYMED.

    // Set storage medium
    //
    STGMEDIUM StgMedium = {0};
    StgMedium.tymed = TYMED_FILE;

Si proporciona un nombre de archivo, debe incluir la extensión de archivo adecuada; WIA 1.0 no proporciona extensiones de archivo. Si el miembro lpszFileName de StgMedium es NULL, WIA 1.0 genera un nombre de archivo aleatorio y una ruta de acceso para los datos transferidos. Mueva o copie este archivo antes de llamar a ReleaseStgMedium, ya que esta función eliminará el archivo.

A continuación, la aplicación llama al método IWiaDataTransfer::idtGetData para ejecutar la transferencia de datos:

    // Perform the transfer
    //
    hr = pWiaDataTransfer->idtGetData( &stgMedium, pWiaDataCallback );

En la llamada a IWiaDataTransfer::idtGetData, el segundo parámetro especifica un puntero a la interfaz IWiaDataCallback . Las aplicaciones deben implementar esta interfaz para recibir devoluciones de llamada durante las transferencias de datos. Para obtener información sobre cómo implementar esta interfaz, vea IWiaDataCallback::BandedDataCallback.

A continuación, la aplicación libera los punteros a la interfaz IWiaDataTransfer y libera los datos asignados en la estructura STGMEDIUM .

La aplicación también puede transferir la imagen mediante transferencias de datos en memoria en lugar de transferencias de archivos. En este caso, la aplicación usa el método idtGetBandedData en lugar del método idtGetData.

Este es el ejemplo completo de transferencia de datos:

HRESULT TransferWiaItem( IWiaItem *pWiaItem )
{
    //
    // Validate arguments
    //
    if (NULL == pWiaItem)
    {
        return E_INVALIDARG;
    }

    //
    // Get the IWiaPropertyStorage interface so you can set required properties.
    //
    IWiaPropertyStorage *pWiaPropertyStorage = NULL;
    HRESULT hr = pWiaItem->QueryInterface( IID_IWiaPropertyStorage, (void**)&pWiaPropertyStorage );
    if (SUCCEEDED(hr))
    {
        //
        // Prepare PROPSPECs and PROPVARIANTs for setting the
        // media type and format
        //
        PROPSPEC PropSpec[2] = {0};
        PROPVARIANT PropVariant[2] = {0};
        const ULONG c_nPropCount = sizeof(PropVariant)/sizeof(PropVariant[0]);

        //
        // Use BMP as the output format
        //
        GUID guidOutputFormat = WiaImgFmt_BMP;

        //
        // Initialize the PROPSPECs
        //
        PropSpec[0].ulKind = PRSPEC_PROPID;
        PropSpec[0].propid = WIA_IPA_FORMAT;
        PropSpec[1].ulKind = PRSPEC_PROPID;
        PropSpec[1].propid = WIA_IPA_TYMED;

        //
        // Initialize the PROPVARIANTs
        //
        PropVariant[0].vt = VT_CLSID;
        PropVariant[0].puuid = &guidOutputFormat;
        PropVariant[1].vt = VT_I4;
        PropVariant[1].lVal = TYMED_FILE;

        //
        // Set the properties
        //
        hr = pWiaPropertyStorage->WriteMultiple( c_nPropCount, PropSpec, PropVariant, WIA_IPA_FIRST );
        if (SUCCEEDED(hr))
        {
            //
            // Get the IWiaDataTransfer interface
            //
            IWiaDataTransfer *pWiaDataTransfer = NULL;
            hr = pWiaItem->QueryInterface( IID_IWiaDataTransfer, (void**)&pWiaDataTransfer );
            if (SUCCEEDED(hr))
            {
                //
                // Create our callback class
                //
                CWiaDataCallback *pCallback = new CWiaDataCallback;
                if (pCallback)
                {
                    //
                    // Get the IWiaDataCallback interface from our callback class.
                    //
                    IWiaDataCallback *pWiaDataCallback = NULL;
                    hr = pCallback->QueryInterface( IID_IWiaDataCallback, (void**)&pWiaDataCallback );
                    if (SUCCEEDED(hr))
                    {
                        //
                        // Perform the transfer using default settings
                        //
                        STGMEDIUM stgMedium = {0};
                        StgMedium.tymed = TYMED_FILE;
                        hr = pWiaDataTransfer->idtGetData( &stgMedium, pWiaDataCallback );
                        if (S_OK == hr)
                        {
                            //
                            // Print the filename (note that this filename is always
                            // a WCHAR string, not TCHAR).
                            //
                            _tprintf( TEXT("Transferred filename: %ws\n"), stgMedium.lpszFileName );

                            //
                            // Release any memory associated with the stgmedium
                            // This will delete the file stgMedium.lpszFileName.
                            //
                            ReleaseStgMedium( &stgMedium );
                        }

                        //
                        // Release the callback interface
                        //
                        pWiaDataCallback->Release();
                        pWiaDataCallback = NULL;
                    }

                    //
                    // Release our callback.  It should now delete itself.
                    //
                    pCallback->Release();
                    pCallback = NULL;
                }

                //
                // Release the IWiaDataTransfer
                //
                pWiaDataTransfer->Release();
                pWiaDataTransfer = NULL;
            }
        }

        //
        // Release the IWiaPropertyStorage
        //
        pWiaPropertyStorage->Release();
        pWiaPropertyStorage = NULL;
    }

    return hr;
}