OpenGL学习笔记(14)像素操作

参考http://www.cnblogs.com/yutianfcl/articles/842414.html

图像与位图不同的是,图像的每个存储可以存储RGBA颜色

绘制像素

绘制一个矩形像素数据

void glDrawPixels(GLsizei width, GLsizei height, GLenum format,
GLenum type, const GLvoid *pixels);
如下示例

/*    Create checkerboard image    */
#define    checkImageWidth 64
#define    checkImageHeight 64
GLubyte checkImage[checkImageHeight][checkImageWidth][3];

static GLdouble zoomFactor = 1.0;
static GLint height;

void makeCheckImage(void)
{
   int i, j, c;
    
   for (i = 0; i < checkImageHeight; i++) {
      for (j = 0; j < checkImageWidth; j++) {
         c = ((((i&0x8)==0)^((j&0x8))==0))*255;
         checkImage[i][j][0] = (GLubyte) c;
         checkImage[i][j][1] = (GLubyte) c;
         checkImage[i][j][2] = (GLubyte) c;
      }
   }
}

void init(void)
{    
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_FLAT);
   makeCheckImage();
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glRasterPos2i(0, 0);
   glDrawPixels(checkImageWidth, checkImageHeight, GL_RGB, 
                GL_UNSIGNED_BYTE, checkImage);
   glFlush();
}

首先makeCheckImage函数创建了一个64x64的一个RGB颜色数组,非黑即白
format与type参数要记得与数组相对应,否则可能会绘制出失帧的图片,效果如下

image

缩放图片

使用glPixelZoom函数可以对图片进行缩放,比如放大3倍glPixelZoom (3, 3);效果如下

image

复制图片

通过glCopyPixels函数进行复制图片,如下代码

glRasterPos2i(0, 0);
glDrawPixels(checkImageWidth, checkImageHeight, GL_RGB, GL_UNSIGNED_BYTE, checkImage);
glRasterPos2i (100, 100);
glCopyPixels (0, 0, checkImageWidth, checkImageHeight, GL_COLOR);

将新图像重新定位到100,100然后复制0,0坐标指定高度宽度的矩形
效果如下

image

其行为类似于先glReadPixels然后glDrawPixels

读取图像数据

可以使用glReadPixels函数读取指定位置的图像数据,如下代码

glRasterPos2i(100, 100);
glReadPixels (0, 0, 32, 32, GL_RGB, GL_UNSIGNED_BYTE,checkImage1);
glDrawPixels(32, 32, GL_RGB, GL_UNSIGNED_BYTE, checkImage1);

效果

image

原文地址:https://www.cnblogs.com/Clingingboy/p/1863575.html