所以这是我的代码的一部分,我要做的是从OpenGl帧捕获中创建一个HBITMAP。
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会自己分配内存,所以错误一定不在这里。输出数组似乎很好。
我也尝试过这里的代码:Creating a HBITMAP from glReadPixels但是它不能正常工作,仍然是NULL。
感谢任何帮助!
答案 0 :(得分:1)
CreateBitmap
的第4个参数是识别单个像素颜色所需的位数。
由于像素数据的格式为GL_RGB
,因此CreateBitmap
的第3个参数为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
要求每条扫描线都是字对齐的。
glReadPixels
操作的alignmnet可以由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];