3ds预览---略缩图

为了一目了然知道模型是什么内容,我们来生成略缩图。

分三步来实现:

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 <GL\glut.h> 
#include <stdio.h>  
#include <stdlib.h>  

#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);  
}  

这个效果和前面没有什么区别,为了不显得太单调,还是加一下:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值