OpenGL抓图程序

转自:http://hi.baidu.com/fairzy/blog/item/9e915b135b935b866438db11.html

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <gl/glut.h>

//消除控制台窗口
#pragma comment( linker,"/subsystem:/"windows/" /entry:/"mainCRTStartup/"" )

static GLint windowWidth = 400, windowHeight = 400;
static GLint fileHeader[54];
static GLint pixelLength;
static GLubyte * pixelDate;
void grab()
{
    FILE * rfile;
FILE * wfile;
//打开文件
rfile = fopen( "D://dummy.bmp", "rb" );
wfile = fopen( "D://OpenGL//程序//读取bmp图像
//grab.bmp", "wb" );
    //读取dummy.bmp的文件头,写入grab.bmp文件中
fread( fileHeader, 54, 1, rfile );
fwrite( fileHeader, 54, 1, wfile );

//更改grab.bmp的头文件中的高度和宽度
fseek( wfile, 0x0012, SEEK_SET );
fwrite( &windowWidth, sizeof(windowWidth), 1, wfile );
fwrite( &windowHeight, sizeof( windowHeight ), 1, wfile );

//为像素分配内存
    pixelLength = windowWidth * 3;
if ( pixelLength % 4 != 0 )
{
   pixelLength += 4 - pixelLength%4;
}
pixelLength *= windowHeight;
pixelDate = (GLubyte *)malloc( pixelLength );
if ( pixelDate == 0 )
{
   printf( "/a/n分配内存失败!" );
}

//读取窗口像素并存储
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
    glReadPixels( 0, 0, windowWidth, windowHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixelDate );

//写入像素数据
fseek( wfile, 0, SEEK_END );
fwrite( pixelDate, pixelLength, 1, wfile );

fclose( rfile );
fclose( wfile );

free( pixelDate );
}

//画一个简单的正方形并截图
void display()
{
glClearColor( 0.7, 0.7, 0.7, 0.0 );
glClear( GL_COLOR_BUFFER_BIT );

glShadeModel( GL_SMOOTH );

glBegin( GL_POLYGON );
      glColor3f( 1.0, 0.0, 0.0 ); glVertex2f( -0.5, -0.5 );
   glColor3f( 0.0, 1.0, 0.0 ); glVertex2f( 0.5, -0.5 );
   glColor3f( 0.0, 0.0, 1.0 ); glVertex2f( 0.5, 0.5 );
   glColor3f( 1.0, 1.0, 0.0 ); glVertex2f( -0.5, 0.5 );
glEnd();

glFlush();

    grab();
}

void myMenu( int value )
{
if ( value == 1 )
{
   exit( 0 );
}
}

int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );
glutInitWindowPosition( 0, 0 );
glutInitWindowSize( windowWidth, windowHeight );
glutCreateWindow( "截图工具" );
glutDisplayFunc( display );

//创建一个右键退出菜单
glutCreateMenu( myMenu );
glutAddMenuEntry( "退出", 1 );
glutAttachMenu( GLUT_RIGHT_BUTTON );

glutMainLoop();

return 1;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值