opengl 显示图片以及保存图片

本文介绍了一个使用OpenGL进行图片加载并在2D平面上显示的简单程序,同时提供了保存OpenGL窗口为图片的方法。在操作过程中,遇到的问题是保存图片时窗口尺寸必须为4的倍数,否则会导致错误。解决方案是在窗口大小改变时,确保其宽度和高度能被4整除。文章还提及了一个OBJ文件读取的代码示例,虽然只能读取点,但可作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

opengl 的贴图功能是很基本的,不过也难住了我这个新手,所以特意写了一个示例程序,以便以后查阅。


程序很简单,只是在在 x, y 平面画一个框,然后贴上一张图。并且可以保存opengl窗口到图片。


程序:

//本程序的目的是展示贴图和保存图片

#include <Windows.h>
#include <gl/glut.h>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;

// Rotation amounts
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;

const int height = 600;
const int width = 800;

static GLbyte TextData[1000*1000*4];
static GLuint TexName;
static int picrows = 0;
static int piccols = 0;

void savepic()
{
	GLint viewPort[4] = {0};
	glGetIntegerv(GL_VIEWPORT, viewPort);

	int winrows = viewPort[3];
	int wincols = viewPort[2];

	GLbyte *colorArr = new GLbyte[winrows*wincols*3];
	glReadPixels(viewPort[0], viewPort[1], viewPort[2], viewPort[3], GL_RGB, GL_UNSIGNED_BYTE, colorArr);
	for(int i=0; i<winrows * wincols * 3; i 
### 如何在 Qt 和 OpenGL 中实现将绘制内容保存为图像文件 #### 使用 `QImage` 结合 `glReadPixels` 为了实现在 Qt 和 OpenGL 中将绘制的内容保存为图像文件,可以利用 `QImage` 类结合 OpenGL 的 `glReadPixels` 函数来读取帧缓冲区中的像素数据并将其转换成图像格式。 ```cpp void saveFramebufferToImage(const QString& filename) { GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); int width = viewport[2]; int height = viewport[3]; GLuint framebuffer; glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); QImage image(width, height, QImage::Format_RGBA8888); glPixelStorei(GL_PACK_ALIGNMENT, 1); // 设置打包对齐方式 glReadBuffer(GL_FRONT); glReadPixels(viewport[0], viewport[1], width, height, GL_RGBA, GL_UNSIGNED_BYTE, image.bits()); // 翻转图像因为OpenGL原点位于左下角而大多数图像库认为它是在左上角 image = image.mirrored(false, true); if (!image.save(filename)) qDebug() << "Failed to save the screenshot."; } ``` 上述代码展示了如何创建一个名为 `saveFramebufferToImage` 的函数用于保存当前视口内的渲染结果到指定路径下的图片文件中[^1]。此方法通过获取当前窗口大小作为新创建的 `QImage` 对象尺寸参数,并调用 `glReadPixels()` 来捕获颜色缓存的数据填充至该对象内;最后再反转垂直方向上的像素排列顺序以便于匹配常规显示习惯并将最终得到的结果存储下来。 另外,在实际项目里可能还需要考虑多线程环境以及不同平台间的兼容性等问题,因此建议开发者们根据具体应用场景调整以上给出的基础方案以满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值