为了一目了然知道模型是什么内容,我们来生成略缩图。
分三步来实现:
1、截屏保存图片(单个)
2、搜索所有3ds模型,调用1,生成所有图
3、同屏显示所有图片
先来实现第一步,网页搜索找到一个截屏函数:
void screenshot(void)
{
#define BMP_Header_Length 54
static GLubyte BMP_Header[BMP_Header_Length]={
0x42,0x4d,0x66,0x75,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x64,0x00,
0x00,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x18,0x00,
0x00,0x00,0x00,0x00,0x30,0x75
};
FILE* pWritingFile; //指向要保存截图的bmp文件
GLubyte* pPixelData; //指向新的空的内存,用于保存截图bmp文件数据
GLint i, j;
GLint PixelDataLength; //BMP文件数据总长度
// 计算像素数据的实际长度
i = WindowWidth * 3; // 得到每一行的像素数据长度
while( i%4 != 0 ) // 补充数据,直到i是4的倍数
++i;
PixelDataLength = i * WindowHeight; //补齐后的总位数
// 分配内存和打开文件
pPixelData = (GLubyte*)malloc(PixelDataLength);
if( pPixelData == 0 )
exit(0);
pWritingFile = fopen("screenshot.bmp", "wb"); //只写形式打开
if( pWritingFile != 0 ) //如果文件没有打开则跳过
{
//把bmp文件的文件头和信息头数据写入,并修改宽高数据
fwrite(BMP_Header, sizeof(BMP_Header), 1, pWritingFile); //文件头和信息头,占据54字节
fseek(pWritingFile, 0x0012, SEEK_SET); //移动到0X0012处,指向图像宽度所在内存
i = WindowWidth;
j = WindowHeight;
fwrite(&i, sizeof(i), 1, pWritingFile);
fwrite(&j, sizeof(j), 1, pWritingFile);
// 读取当前画板上图像的像素数据
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); //设置4位对齐方式
glReadPixels(0, 0, WindowWidth, WindowHeight,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pPixelData);
// 写入像素数据
fseek(pWritingFile, 0, SEEK_END);
//把完整的BMP文件数据写入pWritingFile
fwrite(pPixelData, PixelDataLength, 1, pWritingFile);
// 释放内存和关闭文件
fclose(pWritingFile);
}
free(pPixelData);
}
这个只能保存为 bmp 图,为了便于以后加入其它 库用来保存 jpg 图,成单独一个screenshot.cpp:
// 截屏并保存BMP(jpg)文件
#include
#include
#include
#define WindowWidth 400
#define WindowHeight 400
//这个用保存jpg文件
void SaveJpgPicture(GLubyte* pPixelData,LPCTSTR FileName)
{
//以后再加
}
void SaveBmpPicture(GLubyte* pPixelData,char * FileName) //保存bmp
{
#define BMP_Header_Length 54
static GLubyte BMP_Header[BMP_Header_Length]={
0x42,0x4d,0x66,0x75,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x64,0x00,
0x00,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x18,0x00,
0x00,0x00,0x00,0x00,0x30,0x75
};
FILE* pWritingFile; //指向要保存截图的bmp文件
GLint i, j;
GLint PixelDataLength; //BMP文件数据总长度
// 计算像素数据的实际长度
i = WindowWidth * 3; // 得到每一行的像素数据长度
while( i%4 != 0 ) // 补充数据,直到i是4的倍数
++i;
PixelDataLength = i * WindowHeight; //补齐后的总位数
pWritingFile = fopen(FileName, "wb"); //只写形式打开
if( pWritingFile != 0 ) //如果文件没有打开则跳过
{
//把bmp文件的文件头和信息头数据写入,并修改宽高数据
fwrite(BMP_Header, sizeof(BMP_Header), 1, pWritingFile); //文件头和信息头,占据54字节
fseek(pWritingFile, 0x0012, SEEK_SET); //移动到0X0012处,指向图像宽度所在内存
i = WindowWidth;
j = WindowHeight;
fwrite(&i, sizeof(i), 1, pWritingFile);
fwrite(&j, sizeof(j), 1, pWritingFile);
// 写入像素数据
fseek(pWritingFile, 0, SEEK_END);
//把完整的BMP文件数据写入pWritingFile
fwrite(pPixelData, PixelDataLength, 1, pWritingFile);
// 释放内存和关闭文件
fclose(pWritingFile);
}
}
void screenshot(char* FileName)
{
GLubyte* pPixelData; //指向新的空的内存,用于保存截图数据
GLint PixelDataLength; //数据总长度
PixelDataLength = WindowWidth * 3 * WindowHeight;
// 分配内存和打开文件
pPixelData = (GLubyte*)malloc(PixelDataLength);
if( pPixelData == 0 )
exit(0);
// 读取当前画板上图像的像素数据
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); //设置4位对齐方式
glReadPixels(0, 0, WindowWidth, WindowHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, pPixelData);
//SaveJpgPicture(pPixelData,FileName) ;
SaveBmpPicture (pPixelData,FileName) ;
free(pPixelData);
}
这个效果和前面没有什么区别,为了不显得太单调,还是加一下: