GetDIBits
От: Antony Россия  
Дата: 09.02.02 16:31
Оценка:
У меня есть DIB в памяти (я его получаю извлекая кадр из входящего видеопотока, используя функции видеозахвата). Причём я его сжимаю по выбору одним из кодеков установленных в системе.
Мне нужно делать одно из нижеперечисленного:
1) Вырезать из неё некторый квадрат изображения меньший теукщего. ИЛИ
2) Масштабировать. ИЛИ
3) Или сделав первое или второе сделать её GRAYSCALE.


Я попытался сделать так, как описано ниже но не получилось:


HDC MainDC = GetDC(AfxGetApp()->m_pMainWnd->m_hWnd);
HDC FirstDC = CreateCompatibleDC(MainDC);



// LPBYTE pData; - указывает на начало в памяти DIB'а с BITMAPINFO и массивом данных
// LPBITMAPINFOHEADER pTBIH = (LPBITMAPINFOHEADER)pData;
// Data.X1,Data.X2,Data.Y1,Data.Y2 - желаемый квадрат из DIB


StretchDIBits(FirstDC, 0, 0, Data.X2 - Data.X1, Data.Y2 - Data.Y1, 
        0, 0, Data.X2 - Data.X1, Data.Y2 - Data.Y1, 
        pData + pTBIH->biSize + pTBIH->biClrUsed * sizeof(RGBQUAD),
        (LPBITMAPINFO)pData, DIB_RGB_COLORS, SRCCOPY);

Я так понимаю эта функция копирует квадрат из памяти в FirstDC

Затем пытаюсь извлечь получившуюся картинку:

pTBIH->biWidth = Data.X2 - Data.X1;
pTBIH->biHeight    = Data.Y2 - Data.Y1;
HBITMAP    hBitmap = CreateCompatibleBitmap(MainDC, pTBIH->biWidth, pTBIH->biHeight);
GetDIBits(    FirstDC, hBitmap, 0, (DWORD)pTBIH->biHeight, 
        pData + pTBIH->biSize + pTBIH->biClrUsed * sizeof(RGBQUAD),
        (LPBITMAPINFO)pData, DIB_RGB_COLORS);

Возвращает код ошибки: Параметр задан неверно. (87)
Скорее всего из-за второй переменной.

Но я пробовал и по-другому.
Создал HBITMAP как возврат CreateBitmap;
Выбрал его SelectObject в первый контекст.
StretchBlt во второй.
И оттуда GetDIBits уже от законной HBITMAP, но опять таже ошибка.
Nihil humany a me alienum puto!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.