关于BMP图片转换为16进制数组的问题

lijianping19870813 2010-08-27 11:25:30
小弟正在做一个将24位BMP位图转换为16进制数然后存放在一个二维数组中的程序
网上看到一个程序,遇到一个问题困扰好久,楞是搞不明白,还望大侠们解惑。。。。。。
以下是问题:
for(i=0;i<220;i++)
{
for(j=0;j<176;j++)
buffer[i][j]=0;
}

for(i=0;i<height;i++)
{
for(j=0;j<widthbyte;j+=3)
{
temp0=image[i*widthbyte+j]>>3;
temp1=image[i*widthbyte+j+1]>>2;
temp2=image[i*widthbyte+j+2]>>3;

buffer[i][j/3]=temp2;
buffer[i][j/3]+=temp1<<5;
buffer[i][j/3]+=temp0<<11;
}
}
这段程序是将一个220x176的24位BMP位图的像素点的信息提取出来存放到buffer数组中,其中height是图片的高度(一个像素),widthbyte是宽度一个像素所占的字节数,即width*3,image数组存放的是220x176图片的信息,大小为220*176*3;
呵呵
我愣是搞不清楚最后一个for循环式怎么实现将image里面的数据存到buffer数组中的
望大侠们赐教。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
...全文
830 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bszANDdc 2010-12-28
  • 打赏
  • 举报
回复
兄弟 我现在也在做这方面的东西 看来你是做好了 能不能把转换成十六进制数组的那段 源码提供下 谢谢了
lijianping19870813 2010-08-28
  • 打赏
  • 举报
回复
为什么image[0]-image[7]的值在下面这段代码的前后会不一样啊?哪位大哥帮帮忙解释下啊。。。。。。
for(i=0;i<220;i++)   
{
for(j=0;j<176;j++)
buffer[i][j]=0;
}
lijianping19870813 2010-08-28
  • 打赏
  • 举报
回复
呵呵,真是粗心啊。。。。。。。。。。。
赵4老师 2010-08-27
  • 打赏
  • 举报
回复
image RRRRRrrr,GGGGGGgg,BBBBBbbb
temp 000RRRRR,00GGGGGG,000BBBBB
buffer RRRRRGGGGGGBBBBB
hastings 2010-08-27
  • 打赏
  • 举报
回复
24位位图格式:
RRRRRRRR GGGGGGGG BBBBBBBB
565格式的16位位图:
RRRRRGGG GGGBBBBB
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
恩,呵呵,你也是啊?加个QQ,交流一下啊。120372136
sunrier 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lijianping19870813 的回复:]
就是将图片的像素信息存储到buffer数组中去
[/Quote]
你也在搞位图哈
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
为什么image[0]-image[7]的值在下面这段代码的前后会不一样啊?哪位大哥帮帮忙解释下啊。。。。。。
for(i=0;i<220;i++)   
{
for(j=0;j<176;j++)
buffer[i][j]=0;
}

lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
就是将图片的像素信息存储到buffer数组中去
sunrier 2010-08-27
  • 打赏
  • 举报
回复

for(i=0;i<height;i++)
{
for(j=0;j<widthbyte;j+=3)
{
temp0=image[i*widthbyte+j]>>3;
temp1=image[i*widthbyte+j+1]>>2;
temp2=image[i*widthbyte+j+2]>>3;

buffer[i][j/3]=temp2;
buffer[i][j/3]+=temp1<<5;
buffer[i][j/3]+=temp0<<11;
}
}


请问上面代码什么意思?
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
是不是你那图片的问题?
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
不会啊,我读出来的就是图片的宽度值
bobo364 2010-08-27
  • 打赏
  • 举报
回复
在贴一下你的代码,别人看起来舒服点,还有1.h里的weith=0这是怎么回事?谁答一下。
#include "stdio.h"

int main()
{
FILE *fp,*fout;
int i,j;
unsigned short width,height,widthbyte;
unsigned short temp0,temp1,temp2;
unsigned char ch1,ch2;
unsigned char image[116160];
unsigned short buffer[220][172];


if((fp=fopen("1.bmp","rb"))==NULL)
{
printf("Can't open BMP file!");

}

ch1=fgetc(fp);
ch2=fgetc(fp);
if((ch1!='B')||(ch2!='M'))
{
printf("It's Not BMP file! ");

}


fseek(fp,0x1c,0);
ch1=fgetc(fp);
if(ch1!=0x18)
{
printf("It's Not 24bit true color BMP file! ");

}

if((fout=fopen("1.h","wt"))==NULL)
{
printf("Can't create tiger.h file ");

}

fseek(fp,0x12,0);
fread(&width,1,4,fp);
fseek(fp,0x16,0);
fread(&height,1,4,fp);

if((width>0xB0)||(height>0xDC))
{
printf("The size of BMP is too big! ");

}

if((width*3%4)==0)
{
widthbyte=width*3;
}
else
{
widthbyte=(width*3/4)*4+4;
}
fseek(fp,0x0a,0);
ch1=fgetc(fp);
fseek(fp,ch1,0);
fread(image,1,116160,fp);
for(i=0;i<220;i++)
{
for(j=0;j<176;j++)
{
buffer[i][j]=0;
}
}

for(i=0;i<height;i++)
{
for(j=0;j<widthbyte;j+=3)
{
temp0=image[i*widthbyte+j]>>3;
temp1=image[i*widthbyte+j+1]>>2;
temp2=image[i*widthbyte+j+2]>>3;
buffer[i][j/3]=temp2;
buffer[i][j/3]+=temp1<<5;
buffer[i][j/3]+=temp0<<11;
}
}

fprintf(fout,"/**//*The info of BMPDATA:width=%d height=%d*/ ",width,height);
fprintf(fout,"const unsigned short lcdbuffer[%d][%d]={...}{ ",width,height);

for(i=0;i<height;i++)
{
fprintf(fout,"{");
for(j=0;j<width;j++)
{
fprintf(fout,"0x%x,",buffer[i][j]);
if((j+1)%8==0)
{
fprintf(fout," ");
}
}
fprintf(fout,"} ");
}
fprintf(fout,"}; ");
fclose(fp);
fclose(fout);
system("pause");
return 0;
}
bobo364 2010-08-27
  • 打赏
  • 举报
回复
奇怪我这里读出来的width=0难道说是fseek(fp,0x12,0);
fread(&width,1,4,fp);这句不对?
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
好像和buffer二维数组初始化有关系,如果buffer初始化为1,则image[0]-image[7]的值就是10101010
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
楼上说的我不是很明白啊
现在是这样的,在fread(image,1,116160,fp); 这句话后面输出image[0]-image[7]这些值都是非零值
但是在下面这段代码后面再输出image[0]-image[7],这八个值却全变成0了,为什么啊 ?

for(i=0;i<220;i++)
{
for(j=0;j<176;j++)
buffer[i][j]=0;
}
bobo364 2010-08-27
  • 打赏
  • 举报
回复
for(i=0;i<220;i++)   
{
for(j=0;j<176;j++)
buffer[i][j]=0;
}

for(i=0;i<height;i++)
{
for(j=0;j<widthbyte;j+=3)
{
temp0=image[i*widthbyte+j]>>3;//对每个像素的第一个值右移3位
temp1=image[i*widthbyte+j+1]>>2;
temp2=image[i*widthbyte+j+2]>>3;

buffer[i][j/3]=temp2;//将三个像素的每一位做位移后相加成为一个矩阵单元的值,结果为220*176
buffer[i][j/3]+=temp1<<5;
buffer[i][j/3]+=temp0<<11;
}
}
//总体为对每一个像素的R G B量做相应运算后,在合成一个像素点还原。
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
呵呵,小弟现在又有了个新的问题。。。。。。。。。。。。。
程序如下:
#include "stdio.h"

int main()
{
FILE *fp,*fout;
int i,j;
unsigned short width,height,widthbyte;
unsigned short temp0,temp1,temp2;
unsigned char ch1,ch2;
unsigned char image[116160];
unsigned short buffer[220][172];


if((fp=fopen("牵手.bmp","rb"))==NULL)
{
printf("Can't open BMP file!");
return 0;
}

ch1=fgetc(fp);
ch2=fgetc(fp);
if((ch1!='B')||(ch2!='M'))
{
printf("It's Not BMP file! ");
return 0;
}


fseek(fp,0x1c,0);
ch1=fgetc(fp);
if(ch1!=0x18)
{
printf("It's Not 24bit true color BMP file! ");
return 0;
}

if((fout=fopen("牵手.h","wt"))==NULL)
{
printf("Can't create tiger.h file ");
return 0;
}

fseek(fp,0x12,0);
fread(&width,1,4,fp);
fseek(fp,0x16,0);
fread(&height,1,4,fp);

if((width>0xB0)||(height>0xDC))
{
printf("The size of BMP is too big! ");
return 0;
}

if((width*3%4)==0)
widthbyte=width*3;
else
widthbyte=(width*3/4)*4+4;

fseek(fp,0x0a,0);
ch1=fgetc(fp);
fseek(fp,ch1,0);
fread(image,1,116160,fp);
for(i=0;i<220;i++)
{
for(j=0;j<176;j++)
buffer[i][j]=0;
}

for(i=0;i<height;i++)
{
for(j=0;j<widthbyte;j+=3)
{
temp0=image[i*widthbyte+j]>>3;
temp1=image[i*widthbyte+j+1]>>2;
temp2=image[i*widthbyte+j+2]>>3;
buffer[i][j/3]=temp2;
buffer[i][j/3]+=temp1<<5;
buffer[i][j/3]+=temp0<<11;
}
}

fprintf(fout,"/**//*The info of BMPDATA:width=%d height=%d*/ ",width,height);
fprintf(fout,"const unsigned short lcdbuffer[%d][%d]={...}{ ",width,height);

for(i=0;i<height;i++)
{
fprintf(fout,"{");
for(j=0;j<width;j++)
{
fprintf(fout,"0x%x,",buffer[i][j]);
if((j+1)%8==0)
fprintf(fout," ");
}
fprintf(fout,"} ");
}
fprintf(fout,"}; ");

fclose(fp);
fclose(fout);
return 1;
}
这段程序中红色标志的那句话是将BMP图片的数据读到image数组里面,image[0]-image[7]都是非零值,可是到了
for(i=0;i<height;i++)
{
for(j=0;j<widthbyte;j+=3)
{
temp0=image[i*widthbyte+j]>>3;
temp1=image[i*widthbyte+j+1]>>2;
temp2=image[i*widthbyte+j+2]>>3;
buffer[i][j/3]=temp2;
buffer[i][j/3]+=temp1<<5;
buffer[i][j/3]+=temp0<<11;
}
}
这循环里面image[0]-image[7]的值却全变成0了,这是为什么啊?
lijianping19870813 2010-08-27
  • 打赏
  • 举报
回复
谢谢两位!明白了。。。。。。。。。。。。。。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧