Итак, вот часть моего кода, я пытаюсь сделать HBITMAP из захвата кадра OpenGl.
unsigned char *output = 0;
output = new unsigned char[WINDOW_WIDTH * WINDOW_HEIGHT * 3];
glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE,
output);
HBITMAP hdm = CreateBitmap(800, 800, 1, 32, output);
Но мой (HBITMAP) hdm всегда равен NULL. Может есть другой способ сделать это или что не так? Я предполагаю, что CreateBitmap выделил бы саму память, поэтому ошибка не должна быть здесь. Выходной массив, кажется, в порядке, хотя.
Я также попробовал код отсюда: Создание HBITMAP из glReadPixels но это не сработало, все равно получая NULL.
Буду признателен за любую помощь в этом!
4-й параметр CreateBitmap
количество битов, необходимых для определения цвета одного пикселя.
Поскольку формат данных пикселей GL_RGB
3-й параметр CreateBitmap
должно быть 24 вместо 32. Примечание GL_RGB
/GL_UNSIGNED_BYTE
означает 3 цветовых компонента с каждым байтом, что приводит к 24 битам:
HBITMAP hdm = CreateBitmap(WINDOW_WIDTH, WINDOW_HEIGHT, 1, 24, output);
Или вы должны использовать GL_RGBA
формат:
unsigned char *output = new unsigned char[WINDOW_WIDTH * WINDOW_HEIGHT * 4];
glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, output);
HBITMAP hdm = CreateBitmap(WINDOW_WIDTH, WINDOW_HEIGHT, 1, 32, output);
Примечание, если вы используете GL_RGB
формат, вы должны учитывать, что CreateBitmap
требует, чтобы каждая строка сканирования была выровнена по словам.
Alignmnet для glReadPixels
операция может быть установлена glPixelStorei
, установив параметр GL_PACK_ALIGNMENT
, что по умолчанию 4, так что это не должно быть проблемой.
Но вы должны убедиться, что динамически распределенный буфер достаточно большой:
size_t bpl = WINDOW_WIDTH * 3; // bytes per line
size_t r = bpl % 4; // rest of division by 4
bpl += r ? (4-r) : 0; // bytes per line aligned to 4
unsigned char *output = new unsigned char[bpl * WINDOW_HEIGHT];
или же
size_t bpl = (WINDOW_WIDTH * 3 + 3) & ~3;
unsigned char *output = new unsigned char[bpl * WINDOW_HEIGHT];
Других решений пока нет …