加载bmp文件方法一
来源:互联网 发布:雅思单词书推荐 知乎 编辑:程序博客网 时间:2024/06/06 07:24
第一步:定义类CMyTexture
MyTexture.h文件内容:
typedef struct _ImageRec { unsigned short imagic; unsigned short type; unsigned short dim; unsigned short xsize, ysize, zsize; unsigned int min, max; unsigned int wasteBytes; char name[80]; unsigned long colorMap; FILE *file; unsigned char *tmp, *tmpR, *tmpG, *tmpB; unsigned long rleEnd; unsigned int *rowStart; int *rowSize;} ImageRec;class CMyTexture {public:CMyTexture();virtual ~CMyTexture();void bwtorgba(unsigned char *b,unsigned char *l,int n);void latorgba(unsigned char *b, unsigned char *a,unsigned char *l,int n);void rgbtorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *l,int n); void rgbatorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *a,unsigned char *l,int n); void ConvertShort(unsigned short *array, long length); void ConvertLong(unsigned *array, long length); ImageRec * ImageOpen(const char *fileName);void ImageClose(ImageRec *image); void ImageGetRow(ImageRec *image, unsigned char *buf, int y, int z); unsigned * read_texture(char *name, int *width, int *height, int *components); };
MyTexture.cpp内容:
CMyTexture::CMyTexture(){}CMyTexture::~CMyTexture(){}void CMyTexture::bwtorgba(unsigned char *b,unsigned char *l,int n){ while(n--){l[0] = *b;l[1] = *b;l[2] = *b;l[3] = 0xff;l += 4; b++; }}void CMyTexture::latorgba(unsigned char *b, unsigned char *a,unsigned char *l,int n) { while(n--) {l[0] = *b;l[1] = *b;l[2] = *b;l[3] = *a;l += 4; b++; a++; }}void CMyTexture::rgbtorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *l,int n) { while(n--) {l[0] = r[0];l[1] = g[0];l[2] = b[0];l[3] = 0xff;l += 4; r++; g++; b++; }}void CMyTexture::rgbatorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *a,unsigned char *l,int n) { while(n--) {l[0] = r[0];l[1] = g[0];l[2] = b[0];l[3] = a[0]; l += 4; r++; g++; b++; a++; }}void CMyTexture::ConvertShort(unsigned short *array, long length) { unsigned b1, b2; unsigned char *ptr; ptr = (unsigned char *)array; while (length--) {b1 = *ptr++;b2 = *ptr++;*array++ = (b1 << 8) | (b2); }}void CMyTexture::ConvertLong(unsigned *array, long length) { unsigned b1, b2, b3, b4; unsigned char *ptr; ptr = (unsigned char *)array; while (length--) {b1 = *ptr++;b2 = *ptr++;b3 = *ptr++;b4 = *ptr++;*array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4); }}ImageRec * CMyTexture::ImageOpen(const char *fileName){ union {int testWord;char testByte[4]; } endianTest; ImageRec *image; int swapFlag; int x; endianTest.testWord = 1; if (endianTest.testByte[0] == 1) {swapFlag = 1; } else {swapFlag = 0; } image = (ImageRec *)malloc(sizeof(ImageRec)); if (image == NULL) {fprintf(stderr, "Out of memory!\n");exit(1); } if ((image->file = fopen(fileName, "rb")) == NULL) {perror(fileName);exit(1); } fread(image, 1, 12, image->file); if (swapFlag) {ConvertShort(&image->imagic, 6); } image->tmp = (unsigned char *)malloc(image->xsize*256); image->tmpR = (unsigned char *)malloc(image->xsize*256); image->tmpG = (unsigned char *)malloc(image->xsize*256); image->tmpB = (unsigned char *)malloc(image->xsize*256); if (image->tmp == NULL || image->tmpR == NULL || image->tmpG == NULL ||image->tmpB == NULL) {fprintf(stderr, "Out of memory!\n");exit(1); } if ((image->type & 0xFF00) == 0x0100) {x = image->ysize * image->zsize * sizeof(unsigned);image->rowStart = (unsigned *)malloc(x);image->rowSize = (int *)malloc(x);if (image->rowStart == NULL || image->rowSize == NULL) { fprintf(stderr, "Out of memory!\n"); exit(1);}image->rleEnd = 512 + (2 * x);fseek(image->file, 512, SEEK_SET);fread(image->rowStart, 1, x, image->file);fread(image->rowSize, 1, x, image->file);if (swapFlag) { ConvertLong(image->rowStart, x/(int)sizeof(unsigned)); ConvertLong((unsigned *)image->rowSize, x/(int)sizeof(int));} } else {image->rowStart = NULL;image->rowSize = NULL; } return image;}void CMyTexture::ImageClose(ImageRec *image) { fclose(image->file); free(image->tmp); free(image->tmpR); free(image->tmpG); free(image->tmpB); free(image->rowSize); free(image->rowStart); free(image);}void CMyTexture::ImageGetRow(ImageRec *image, unsigned char *buf, int y, int z) { unsigned char *iPtr, *oPtr, pixel; int count; if ((image->type & 0xFF00) == 0x0100) {fseek(image->file, (long)image->rowStart[y+z*image->ysize], SEEK_SET);fread(image->tmp, 1, (unsigned int)image->rowSize[y+z*image->ysize], image->file);iPtr = image->tmp;oPtr = buf;for (;;) { pixel = *iPtr++; count = (int)(pixel & 0x7F); if (!count) {return; } if (pixel & 0x80) {while (count--) { *oPtr++ = *iPtr++;} } else {pixel = *iPtr++;while (count--) { *oPtr++ = pixel;} }} } else {fseek(image->file, 512+(y*image->xsize)+(z*image->xsize*image->ysize), SEEK_SET);fread(buf, 1, image->xsize, image->file); }}unsigned * CMyTexture::read_texture(char *name, int *width, int *height, int *components) { unsigned *base, *lptr; unsigned char *rbuf, *gbuf, *bbuf, *abuf; ImageRec *image; int y; image = ImageOpen(name); if(!image)return NULL; (*width)=image->xsize; (*height)=image->ysize; (*components)=image->zsize; base = (unsigned *)malloc(image->xsize*image->ysize*sizeof(unsigned)); rbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); gbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); bbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); abuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); if(!base || !rbuf || !gbuf || !bbuf) return NULL; lptr = base; for(y=0; y<image->ysize; y++) {if(image->zsize>=4) { ImageGetRow(image,rbuf,y,0); ImageGetRow(image,gbuf,y,1); ImageGetRow(image,bbuf,y,2); ImageGetRow(image,abuf,y,3); rgbatorgba(rbuf,gbuf,bbuf,abuf,(unsigned char *)lptr,image->xsize); lptr += image->xsize;} else if(image->zsize==3) { ImageGetRow(image,rbuf,y,0); ImageGetRow(image,gbuf,y,1); ImageGetRow(image,bbuf,y,2); rgbtorgba(rbuf,gbuf,bbuf,(unsigned char *)lptr,image->xsize); lptr += image->xsize;} else if(image->zsize==2) { ImageGetRow(image,rbuf,y,0); ImageGetRow(image,abuf,y,1); latorgba(rbuf,abuf,(unsigned char *)lptr,image->xsize); lptr += image->xsize;} else { ImageGetRow(image,rbuf,y,0); bwtorgba(rbuf,(unsigned char *)lptr,image->xsize); lptr += image->xsize;} } ImageClose(image); free(rbuf); free(gbuf); free(bbuf); free(abuf); return (unsigned *) base;}第二:使用:
定义函数LoadTexture(char *fn, int t_num),内容如下:
int texwid, texht;int texcomps; teximage = m_Tex->read_texture(fn, &texwid, &texht, &texcomps);if (!teximage){MessageBox("没有找到图形文件tr.rgb","错误",MB_ICONQUESTION);exit(0);}glBindTexture(GL_TEXTURE_2D, texture[t_num]);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glTexImage2D(GL_TEXTURE_2D, 0, 3, texwid, texht, 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage);gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texwid, texht, GL_RGBA, GL_UNSIGNED_BYTE, teximage);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); free(teximage);声明参数:
CMyTexture* m_Tex;unsigned *teximage;GLuint texture[6];
0 0
- 加载bmp文件方法一
- wince 加载bmp文件方法
- 加载bmp文件方法二
- OpenGL加载BMP文件
- 加载bmp文件
- 加载BMP文件 并绘制
- bmp文件动态加载显示
- OpenGLES加载BMP文件为纹理
- C语言构建BMP文件(一)
- C++ BMP转JPG方法一
- BMP文件存放像素的方法
- (nehe教程)不使用auxDIBImageLoad,加载bmp文件
- MFC 的 Picture Control 加载 BMP/PNG 图片的方法
- vc 加载bmp位图并显示的方法
- MFC 的Picture Control加载BMP和PNG的方法
- MFC 的 Picture Control 加载 BMP/PNG 图片的方法
- 两种加载BMP纹理图像的方法
- BMP文件
- dependency analysis warning: The copy bundle resources build phase contains
- OpenCV成长之路(4):图像直方图
- Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)
- pl2303 ch340 max232的区别
- 我的程序员人生路——雷军(2)
- 加载bmp文件方法一
- Js - 获取url地址栏
- 关于user/zhu/proj.android/.
- volatile
- 62. PHP 类简介
- nasm预处理器(4)
- Android事件传递机制之onInterceptTouchEvent()和onTouchEvent()总结
- 运维工程师的职责和前景[转载]
- redis 3.0 cluster 集群 学习之路篇(资料汇总)