Condividi tramite


Metodo IMediaDet::GetBitmapBits

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Nota

[Deprecata. Questa API può essere rimossa dalle versioni future di Windows.]

 

Il GetBitmapBits metodo recupera un fotogramma video in corrispondenza del tempo multimediale specificato. Il frame restituito è sempre in formato RGB a 24 bit.

Sintassi

HRESULT GetBitmapBits(
   double StreamTime,
   long   *pBufferSize,
   char   *pBuffer,
   long   Width,
   long   Height
);

Parametri

StreamTime

Tempo in cui recuperare il fotogramma video, in secondi.

pBufferSize

Riceve le dimensioni del buffer necessarie. Se pBuffer è NULL, la variabile riceve le dimensioni del buffer necessarie per recuperare il frame. Se pBuffer non è NULL, questo parametro viene ignorato.

pBuffer

Puntatore a un buffer che riceve una struttura BITMAPINFOHEADER seguita dai bit DIB.

Width

Larghezza dell'immagine video, in pixel.

Altezza

Altezza dell'immagine video, in pixel.

Valore restituito

Restituisce un valore HRESULT . I possibili valori sono i seguenti:

Codice restituito Descrizione
S_OK
Operazione completata.
E_NOINTERFACE
Impossibile aggiungere il filtro Sample Grabber al grafico.
E_OUTOFMEMORY
Memoria insufficiente.
E_POINTER
Errore del puntatore NULL.
E_UNEXPECTED
Errore imprevisto.
VFW_E_INVALIDMEDIATYPE
Tipo di supporto non valido.

 

Commenti

Prima di chiamare questo metodo, impostare il nome e il flusso del file chiamando IMediaDet::p ut_Filename e IMediaDet::p ut_CurrentStream.

Per determinare le dimensioni del buffer necessario, chiamare questo metodo con pBuffer uguale a NULL. La dimensione viene restituita nella variabile a cui punta pBufferSize. Creare quindi il buffer e chiamare di nuovo il metodo , con pBuffer uguale all'indirizzo del buffer. Al termine del metodo, il buffer contiene una struttura BITMAPINFOHEADER seguita dalla bitmap. La bitmap viene ridimensionata in base alle dimensioni specificate nei parametri Width e Height .

Questo metodo inserisce il rilevatore multimediale in modalità di afferramento bitmap. Dopo aver chiamato questo metodo, i vari metodi di informazioni sul flusso in IMediaDet non funzionano, a meno che non si crei una nuova istanza del rilevatore multimediale.

Nota

Il file di intestazione Qedit.h non è compatibile con le intestazioni Direct3D successive alla versione 7.

 

Nota

Per ottenere Qedit.h, scaricare l'aggiornamento Microsoft Windows SDK per Windows Vista e .NET Framework 3.0. Qedit.h non è disponibile nella Microsoft Windows SDK per Windows 7 e .NET Framework 3.5 Service Pack 1.

 

Esempio

Il codice seguente usa il GetBitmapBits metodo per creare una bitmap indipendente dal dispositivo.

long size;
hr = pDet->GetBitmapBits(0, &size, 0, width, height);
if (SUCCEEDED(hr)) 
{
    char *pBuffer = new char[size];
    if (!pBuffer)
        return E_OUTOFMEMORY;
    try {
        hr = pDet->GetBitmapBits(0, 0, pBuffer, width, height);
    }
    catch (...) {
        delete [] pBuffer;
        throw;
    }
    if (SUCCEEDED(hr))
    {
        BITMAPINFOHEADER *bmih = (BITMAPINFOHEADER*)pBuffer;
        HDC hdcDest = GetDC(0);
        
        // Find the address of the start of the image data.
        void *pData = pBuffer + sizeof(BITMAPINFOHEADER);
        
        // Note: In general a BITMAPINFOHEADER can include extra color
        // information at the end, so calculating the offset to the image
        // data is not generally correct. However, the IMediaDet interface
        // always returns an RGB-24 image with no extra color information.
        
        BITMAPINFO bmi;
        ZeroMemory(&bmi, sizeof(BITMAPINFO));
        CopyMemory(&(bmi.bmiHeader), bmih, sizeof(BITMAPINFOHEADER));
        HBITMAP hBitmap = CreateDIBitmap(hdcDest, bmih, CBM_INIT, 
            pData, &bmi, DIB_RGB_COLORS);
    }
    delete[] pBuffer;
}

Requisiti

Requisito Valore
Intestazione
Qedit.h
Libreria
Strmiids.lib

Vedi anche

Interfaccia IMediaDet

Codici di errore e di esito positivo