Linux如何正确的glReadPixels将数据写入QImage
How to glReadPixels properly to write the data into QImage in Linux
总结
我想将 glReadPixels 的 opengl 像素 (GL_RGB) 写入 QImage.This 渲染正确,但是当我调整 window 的大小时,它会奇怪地缩放并扭曲我的形状 (三角形)。
我试过的
我试过了(QImage)img.scale(width(),height(),Qt::KeepAspectRatio)
但是并没有解决问题。
试过如何将像素缓冲区从 glReadPixels
写入 QImage
,但 No.Didn 不起作用。
我应该读取三个缓冲区中的像素(GLubyte *rpixel、*gpixel、*bpixel)还是一个(GLubyte **pixels)?哪个最简单,因为我会在调整数组大小时调整数组大小window(所以我想要动态数组)。
一些代码
我已经上传了一个最小的代码来重新创建 github.Download 中的 bug-weird 行为并使用 Qt Creator 进行编译。
https://github.com/rivenblades/GlReadPixelsQT/tree/master
图片
这是我想要的(不调整大小时有效)
这是调整大小后的样子(奇怪的行为)
如您所见,在调整大小时,图像在右侧被分割,在左侧可能在另一个处连续 row.So 我猜图像的尺寸是错误的(需要更大的宽度?)。
默认情况下,假定图像每行的开头与 4 个字节对齐。这是因为GL_PACK_ALIGNMENT
和GL_UNPACK_ALIGNMENT
参数默认都是4,见glPixelStore
.
当 glReadPixels
读取帧缓冲区时,会考虑 GL_PACK_ALIGNMENT
参数。
如果你想在一个紧凑的内存中读取图像,而不是在每行的开头对齐,那么你必须在读取颜色平面之前将 GL_PACK_ALIGNMENT
参数更改为 1帧缓冲区:
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_RED, GL_UNSIGNED_BYTE, tga.rpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_GREEN, GL_UNSIGNED_BYTE, tga.gpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_BLUE, GL_UNSIGNED_BYTE, tga.bpic);
如果遗漏了这一点,则会在图像的每一行产生偏移效果,除非图像的一行长度(以字节为单位)可以被 4 整除。
总结
我想将 glReadPixels 的 opengl 像素 (GL_RGB) 写入 QImage.This 渲染正确,但是当我调整 window 的大小时,它会奇怪地缩放并扭曲我的形状 (三角形)。
我试过的
我试过了(QImage)img.scale(width(),height(),Qt::KeepAspectRatio)
但是并没有解决问题。
试过如何将像素缓冲区从 glReadPixels
写入 QImage
,但 No.Didn 不起作用。
我应该读取三个缓冲区中的像素(GLubyte *rpixel、*gpixel、*bpixel)还是一个(GLubyte **pixels)?哪个最简单,因为我会在调整数组大小时调整数组大小window(所以我想要动态数组)。
一些代码
我已经上传了一个最小的代码来重新创建 github.Download 中的 bug-weird 行为并使用 Qt Creator 进行编译。 https://github.com/rivenblades/GlReadPixelsQT/tree/master
图片
这是我想要的(不调整大小时有效)
这是调整大小后的样子(奇怪的行为)
如您所见,在调整大小时,图像在右侧被分割,在左侧可能在另一个处连续 row.So 我猜图像的尺寸是错误的(需要更大的宽度?)。
默认情况下,假定图像每行的开头与 4 个字节对齐。这是因为GL_PACK_ALIGNMENT
和GL_UNPACK_ALIGNMENT
参数默认都是4,见glPixelStore
.
当 glReadPixels
读取帧缓冲区时,会考虑 GL_PACK_ALIGNMENT
参数。
如果你想在一个紧凑的内存中读取图像,而不是在每行的开头对齐,那么你必须在读取颜色平面之前将 GL_PACK_ALIGNMENT
参数更改为 1帧缓冲区:
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_RED, GL_UNSIGNED_BYTE, tga.rpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_GREEN, GL_UNSIGNED_BYTE, tga.gpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_BLUE, GL_UNSIGNED_BYTE, tga.bpic);
如果遗漏了这一点,则会在图像的每一行产生偏移效果,除非图像的一行长度(以字节为单位)可以被 4 整除。