OpenGL glReadPixels 转成 CImage
本来是一件很简单的事情,就是将View上使用OpenGL画出来的数据生成图片让其实现打印的功能,我们知道MFC提供打印的接口是不支持OpenGL的(至少我不清楚),必须将它转成GDI再画在Print的pDC上。
OpenGL一直都有一个函数名字叫:glReadPixels,它能read a block of pixels from the frame buffer,但是谁都没想到它竟然转换成CImage竟然是这样的规则。
http://www.opengl.org/sdk/docs/man/xhtml/glReadPixels.xml中说到:Specify the window coordinates of the first pixel that is read from the frame buffer. This location is the lower left corner of a rectangular block of pixels. 是从左下角开始读,这一条是我始料未及的,一般通常都是从左上角开始的,我至今没想明白为什么它要这样设计。在调用这个函数之前还需要glReadBuffer(GL_BACK_LEFT);这句,如果你想将它设置成GL_FRONT_LEFT似乎还不行,它并不会从左上角开始,真弄不懂这设计者的逻辑。
然后接着下一步就开始往CImage里面写东西了:直接上code:
.h文件中定义:
GLubyte *_print_image_data;
CImage _print_img;
OnPreparePrinting(CPrintInfo* pInfo)
_print_image_data = nullptr;
glReadBuffer(GL_BACK_LEFT);
OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
int format = GL_RGB ,components = , width = m_width, height = m_height;
switch(format) {
case GL_RGB:
components = ; break;
case GL_RGBA:
components = ; break;
case GL_ALPHA:
case GL_LUMINANCE:
components = ; break;
}
_print_image_data = (GLubyte*)malloc(components * width * height);
glReadPixels(, , width, height, format, GL_UNSIGNED_BYTE, _print_image_data);
_print_img.Create(width, height, ); int nPixel = height*width*;
for(int j = ; j <height ; j++)
for(int i = width-; i >=; i--)
{
BYTE b = _print_image_data[--nPixel];
BYTE g = _print_image_data[--nPixel];
BYTE r = _print_image_data[--nPixel];
_print_img.SetPixelRGB(i, j, r,g,b);
}
OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
free(_print_image_data);
_print_image_data = nullptr;
_print_img.Destroy();
OnPrint(CDC* pDC, CPrintInfo* pInfo)
if(_print_image_data != nullptr)
_print_img.Draw(pDC->m_hDC, , , _print_img.GetWidth()*, _print_img.GetHeight()*);
可以看到那个x、y轴的双层循环的code真是有点怪异,一个++、一个--,但是又必须这样写才能对,希望以后有人再碰到这种情况能够Lucky的找到我这篇blog了吧。
OpenGL glReadPixels 转成 CImage的更多相关文章
- 把jpg文件读取到内存char* 再转换成CImage
网络上找到大神写的转换方法,不过就记下来,学习学习: 当然转成CImage之后就可以从CImage转换成HBITMAP 了 void DrawPic(CDC *pDC,char *buf,int le ...
- 现代3D图形编程学习-基础简介(3)-什么是opengl (译)
本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...
- OpenGL中平移、旋转、缩放矩阵堆栈操作
在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. ...
- 建立第一个OpenGL工程(GLUT)
本文参考了<计算机图形学>(Donald Hearn著)的第2.9节. OpenGL基本函数库用来描述图元.属性.几何变换.观察变换和进行许多其他的操作.OpenGL被设计成与硬件无关,因 ...
- [C++][OpenGL]自己写GUI(0)——介绍
文章可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6928612.html.文章未完,如果不在博客园(cnblogs)发现本文,请访问前面的链接查 ...
- OpenGL介绍
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植:OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图 ...
- 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法 .(转)
单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...
- OpenGL的前世和今生
这并不是一个恰当的题目,因为我主要想说的是OpenGL的今生,基于OpenGL3.x一种更现代化的方式.但是把前世和今生放在一起在语言上更加连贯,而且适当的了解过去,会帮助理解现在的OpenGL,以一 ...
- GJM : 各大开发游戏引擎
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
随机推荐
- 从零开始安装 Ambari (2) -- 准备本地 repository
安装 Ambari,最后是为了用它部署 hadoop 集群.安装时默认使用的是 hortonworks 远程的资源,用它部署集群时,需要下载 Hadoop.Hive.HBase 的安装包,速度很慢.我 ...
- 帝都Day4(2)——数据结构
黄姓dalao is coming! 一.栈: 基本常识略. 例题:铁轨 模拟,O(n), Usaco2006 Nov 题目略 做法:单调栈(续命栈?) n//数量 a[]//奶牛 for(int i ...
- LogAspect
import java.lang.reflect.Array; import java.lang.reflect.Method; import java.text.SimpleDateFormat; ...
- HIVE获取表的大小和修改日期
### 获取表的大小 hdfs dfs -du /user/hive/warehouse/database_name.db/ > 360_du ### 获取表的修改日期 hdfs dfs -ls ...
- 01-----jQuery介绍
安装node.js cmd查看 node -v npm -v npm init --yes 初始化 npm install jquery --save 1.为什么要使用jQuery ...
- Storm概念学习系列之Topology拓扑
不多说,直接上干货! Hadoop 上运行的是 MapReduce 作业,而在 Storm 上运行的是拓扑 Topology,这两者之间是非常不同的.一个关键的区别是:一个MapReduce 作业 ...
- JavaScript 浮点数处理
众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004.1-0.9=0. ...
- phpize使用方法
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,下面介绍一个它的使用方法,需要的朋友可以参考下 安装(fastcgi模式)的时候,常常有这样一句命令: 代码如下: / ...
- pygame 使用
模块概况 display image event key mouse font 类概况 Rect: 返回的矩阵区域(图片) Surface: 可以看做是一个贴图, 它就是来显示的 display(与显 ...
- babel7中 preset-env 完全使用
babel7中 preset-env 完全使用 const presets = [ ['@babel/env', { // chrome, opera, edge, firefox, safari, ...