无法从 glReadpixel 创建 HBITMAP
Couldn't create HBITMAP from glReadpixels
这是我代码的一部分,我想做的是从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总是空的。也许还有另一种方法可以做到这一点,或者有什么问题?我想CreateBitmap会自己分配内存,所以错误一定不在这里。不过输出数组似乎很好。
我也尝试了这里的代码:从glReadPixel创建HBITMAP,但它没有很好地工作,仍然得到NULL。
将不胜感激任何帮助!
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];
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 在Windows上用C++裁剪HBITMAP
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 无法从 glReadpixel 创建 HBITMAP
- 通过将现有HICON绘制为HBITMAP,从现有HICON创建HICON
- 在构造函数中创建hbitmap返回NULL
- 从非托管代码传递HBITMAP句柄到托管代码创建System.Drawing.Bitmap的安全性