У меня есть 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, но опять таже ошибка.