Поделиться через


Метод IMediaDet::GetBitmapBits

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Примечание

[Не рекомендуется. Этот API можно удалить из будущих выпусков Windows.]

 

Метод GetBitmapBits извлекает видеокадр в указанное время мультимедиа. Возвращаемый кадр всегда имеет 24-разрядный формат RGB.

Синтаксис

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

Параметры

StreamTime

Время извлечения видеокадра в секундах.

pBufferSize

Получает требуемый размер буфера. Если pBuffer имеет значение NULL, переменная получает размер буфера, необходимый для извлечения кадра. Если pBuffer не имеет значение NULL, этот параметр игнорируется.

pBuffer

Указатель на буфер, который получает структуру BITMAPINFOHEADER , за которой следуют биты DIB.

Width

Ширина видеоимнима в пикселях.

Height

Высота видеоимнима в пикселях.

Возвращаемое значение

Возвращает значение HRESULT . Возможные значения:

Код возврата Описание
S_OK
Успешно.
E_NOINTERFACE
Не удалось добавить фильтр Sample Grabber в граф.
E_OUTOFMEMORY
Недостаточно памяти.
E_POINTER
Ошибка указателя NULL.
E_UNEXPECTED
Непредвиденная ошибка.
VFW_E_INVALIDMEDIATYPE
Недопустимый тип носителя.

 

Комментарии

Перед вызовом этого метода задайте имя файла и поток, вызвав IMediaDet::p ut_Filename и IMediaDet::p ut_CurrentStream.

Чтобы определить необходимый размер буфера, вызовите этот метод с pBuffer равным NULL. Размер возвращается в переменной, на которую указывает pBufferSize. Затем создайте буфер и вызовите метод еще раз с pBuffer , равным адресу буфера. При возврате метода буфер содержит структуру BITMAPINFOHEADER , за которой следует растровое изображение. Растровое изображение масштабируется до размеров, указанных в параметрах Width и Height .

Этот метод переводит детектор мультимедиа в режим захвата растрового изображения. После вызова этого метода различные методы потоковой информации в IMediaDet не будут работать, если не создать новый экземпляр детектора мультимедиа.

Примечание

Файл заголовка Qedit.h несовместим с заголовками Direct3D более поздней версии 7.

 

Примечание

Чтобы получить Qedit.h, скачайте обновление Microsoft Windows SDK для Windows Vista и платформа .NET Framework 3.0. Qedit.h недоступен в Microsoft Windows SDK для Windows 7 и платформа .NET Framework 3.5 с пакетом обновления 1 (SP1).

 

Примеры

В следующем коде GetBitmapBits используется метод для создания аппаратно-независимого растрового изображения.

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;
}

Требования

Требование Значение
Заголовок
Qedit.h
Библиотека
Strmiids.lib

См. также раздел

Интерфейс IMediaDet

Коды ошибок и успешного выполнения