该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我们在控制台不能讲RGB都画出来,只能选一个分量来画,就选红色分量来画吧。
还有一点就是,24位2位图储存的像素数据是上下颠倒的,如果你用顺序将文件像素读出来并画出的话就会发现图片上下颠倒了,我们需要注意这一点。还有一个要特别说明,控制台的横向最多能画80个字符,所以我们的位图图片的宽度必须设定为80!!
ok下面开始读取像素并画图
void main()
{
char pix,blank; //pix将存放我们读取出的红色分量数据,blank存放图片的背景颜色。我//们将用第一个读取出来的像素作为背景色,以后只要不是背景色的红色像素我们都画出来
int width,hight; //宽、高
FILE* pi;
pi=fopen("1.bmp","r");
if(pi==NULL) return;
fseek(pi,0x0012,SEEK_SET); //偏移0x0012个字节
fread(&width,sizeof(int),1,pi); //读取宽度
fread(&hight,sizeof(int),1,pi); //读取高度
if(width!=80) printf("图片宽度必须为80\n");
fseek(pi,54,SEEK_SET); //偏移54个字节以后后面就直接是赤裸裸的像素数据了,下面第//一个字节储存的就是第一个像素RGB的R
blank=fgetc(pi); //我们规定第一个读取出来的红色分量就是背景色
for(int i=0;i
{
/*
这里注意一下,因为我们的位图是上下颠倒的,所以第一行的像素在最后一行储存着呢
*/
fseek(pi,54,SEEK_SET); //跳回像素开头
fseek(pi,(hight-i-1)*3*80,SEEK_CUR); //跳过前hight-i-1行的数据
for(int j=0;j<80;++j) //循环宽
{
pix=fgetc(pi);
if(pix==blank) printf(" "); //如果像素为背景色,就画一个空格
else printf("%c",2); //反之画一个笑脸
//注意,我们读取完一个红色后还要跳过两个字节呢,RGB的GB我们不要了
fseek(pi,sizeof(char)*2,SEEK_CUR);
}
}
}