标题:[求助]关于读取位图纹理
只看楼主
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
 问题点数:0 回复次数:3 
[求助]关于读取位图纹理

void renderview(void)//读取背景纹理
{
int i,j;
FILE *fp;
unsigned char *image;
int rc;
fp=fopen("5.bmp","rb");
if(!fp)std::cout<<"Cannot read background!"<<endl;
fseek(fp,54,SEEK_SET);
image=(unsigned char*)malloc(WIDTH*WIDTH*3);
rc=fread(image,sizeof(unsigned char),WIDTH*WIDTH*3,fp);
fclose(fp);

for(i=0;i<WIDTH;i++)
{
for(j=0;j<WIDTH;j++)
{
texImg[i][j][2]=(GLubyte)*(image+i*WIDTH*3+j*3);
texImg[i][j][1]=(GLubyte)*(image+i*WIDTH*3+j*3+1);
texImg[i][j][0]=(GLubyte)*(image+i*WIDTH*3+j*3+2);
}
}
}



以上是一段标准的读取bmp格式图片的代码,如果定义WIDTH=1024,那么就是读取1024*1024的正方形的bmp图

我想问的是
1.如果我想读取一个长方形的位图,比如1024*512,应该怎样修改一下?
WIDTH=1024;
LENGTH=512;

void renderview(void)//读取背景纹理
{
int i,j;
FILE *fp;
unsigned char *image;
int rc;
fp=fopen("5.bmp","rb");
if(!fp)std::cout<<"Cannot read background!"<<endl;
fseek(fp,54,SEEK_SET);
image=(unsigned char*)malloc(WIDTH*LENGTH*3);
rc=fread(image,sizeof(unsigned char),WIDTH*LENGTH*3,fp);
fclose(fp);

for(i=0;i<WIDTH;i++)
{
for(j=0;j<LENGTH;j++)
{
texImg[i][j][2]=(GLubyte)*(image+i*WIDTH*3+j*3);
texImg[i][j][1]=(GLubyte)*(image+i*WIDTH*3+j*3+1);
texImg[i][j][0]=(GLubyte)*(image+i*WIDTH*3+j*3+2);
}
}
}
蓝色的部分应该怎么改呢?


2.哪里有比较方便能找到bmp图的地方,感觉到处都是JPEG

谢谢


搜索更多相关主题的帖子: 位图 纹理 
2006-03-13 15:51
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
得分:0 

void renderview(void)//读取背景纹理
{
int i,j;
FILE *fp;
unsigned char *image;
int rc;
fp=fopen("5.bmp","rb");
if(!fp)std::cout<<"Cannot read background!"<<endl;
fseek(fp,54,SEEK_SET);
image=(unsigned char*)malloc(WIDTH*LENGTH*3);
rc=fread(image,sizeof(unsigned char),WIDTH*LENGTH*3,fp);
fclose(fp);

for(i=0; i<LENGTH; i++) //LENGTH应该是行数,对应bmp的高
{
for(j=0; j<WIDTH; j++) //WIDTH应该是列数,对应bmp的宽
{//这里应该就不用改了,正好读取到了RGB的信息了。
texImg[i][j][2]=(GLubyte)*(image+i*WIDTH*3+j*3);
texImg[i][j][1]=(GLubyte)*(image+i*WIDTH*3+j*3+1);
texImg[i][j][0]=(GLubyte)*(image+i*WIDTH*3+j*3+2);
}
}
}


谷底深深行 ,峰顶漫漫步......@_@
2006-03-13 16:31
eecchhoo
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-2-24
得分:0 
非常感谢
fseek(fp,54,SEEK_SET);
这里的54是什么意思
2006-03-13 16:36
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
得分:0 

fseek(FILe *stream, long offset, int origin);

stream:文件指针
offset:指针偏移量
origin:文件指针初值,常量SEEK_SET表示在文件开始处
这里54(字节),应该是这样的:
bmp文件由以下几总分构成:
(1)bmp文件头
(2)位图信息头
(3)颜色表
(4)位图数据
所以必须有一定的偏移量指针才能指向颜色表,至于是不是54个字节,可以通过计算得到,offset = sizeof(bmp文件头)+sizeof(位图信息头)


谷底深深行 ,峰顶漫漫步......@_@
2006-03-13 18:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-50173-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014012 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved