C语言读取1位的BMP图

C语言如何用数组保存1位BMP图的位图数据?8个元素由一个字节保存 不会读取- -
要不要用到BMP图的颜色表?
然后如何显示出来?打算用putpixel函数画点....不过总不成功
求解

位深为1的bmp图,一般是有要有颜色表的,没有时用黑白色代替。
数据保存是1位为一个像素点。
要使用左移位右移位运算。
比如读出一个字节
a
byte p = (a>>7);//就是第一个像素点的颜色索引。再颜色表中找出对应的颜色就行了。
p=((a<<1)>>6);//这就是第二个像素点了.
同理可以得到其他的像素点追问

不用颜色索引可以的吗?..反正就黑白两种色
如果用二维数组保存可以直接用fread保存到一个二维数组中吗?
数组的大小为 宽*高/64?..

追答

可以,但
位图是数据的宽跟像素的宽不一定相等的。
位图中定义了数据的宽必须是4个字节的倍数,一行的像素所用的字节数不是4的倍数时要在后面补齐为4的倍数
比如 ,你的1位深的图,假设像素为24*100。
那么数据是这样的 1位深是用位来表示一个像素的 ,一行是24个像素,那么就是用3个字节字节就可以表示了 ,但由于需要不齐,那么就是 4个字节,32位,
位图数据的大小为4*100个字节,而不是3*100个字节

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-23
int x,y,color;
x=15;y=15;
color = random(getmaxcolor() + 1);  
putpixel(x, y, color);
注:这里color由系统定义,如果你想要自定义color,需要用到RGB函数时行分量转换。
例如:color=R+256G+256*256B
如果RGB=(1,2,3)
那么:color=1+256*2+256*256*3追问

x y为什么是15?
还有....怎样画出一幅图?
这里只画了一个点

追答

(x,y)=(15,15)我只是举例随便画一个点告诉你color的用法。
如果你想画一张BMP图,在纯C语言中还真不是一件简单的任务:
1、学会BMP文件头部信息,从文件头部信息知道BMP图片内容信息,然后读入数组;
2、如果BMP是灰度图,那么一个字节表示一个像素;如果是真彩色,那么三个字节表示一个像素;
3、用一个循环将每个点putpixel。
下面给出一个范例,用putimage实现:
#include "stdio.h"
#include "dir.h"
#include "dos.h"
#include "graphics.h"
char *malloc();/*malloc转换*/
char bmp_to_dat(char *bmp,char *dat)
/*将16色BMP文件转换为可以用putimage输出的格式,bmp为原BMP文件,dat为转化文件*/
{ unsigned char c[8],scan_times,scan_pixs;
unsigned char workpos;int i,j,k,n,nowpos,iw,ih;
static int color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};
unsigned char workline[640],scanline[640];
FILE *fp,*targetfp;
union
{ unsigned char value;
struct
{
unsigned cl:4;
unsigned ch:4;
}color;
}mycolor;
if((fp=fopen(bmp,"rb"))==NULL)return(0);
targetfp=fopen(dat,"wb");
fseek(fp,18,SEEK_SET);
iw=0;ih=0;
fread(&iw,4,1,fp); /*读图像宽度*/
fread(&ih,4,1,fp); /*读图像高度*/
if(iw==0&&ih==0&&iw>640&&ih>480)
{fclose(fp);fclose(targetfp);return(0);}
iw--;ih--; /*∵putimage中的长宽比实际数值少1*/
scan_times=iw/8+1; /*行处理单位数*/
scan_pixs=scan_times*4; /*行像素字节数∵1单位=4字节*/
fputc(iw%256,targetfp); /*填充信息头:长、宽部分*/
fputc(iw/256,targetfp);
fputc(ih%256,targetfp);
fputc(ih/256,targetfp);
fseek(fp,-scan_pixs,SEEK_END);
for(j=0;j<=ih;j++)

第2个回答  2011-06-23
/* 单色BMP图形文件显示 */

#include "graphics.h"
#include<stdio.h>
#include<conio.h>
/* BMP 文件头部结构 */
struct header
{
unsigned int bfType;
long bfSize;
unsigned int bfReserved1;
unsigned int bfReserved2;
long bfoffBits;
};

struct tinfoheader
{
long biSize;
long biWidth;
long biHeight;
unsigned int biPlanes;
unsigned int biBitCount;
long biCompression;
long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
long biClrUsed;
long biClrImportant;
};
struct header HEADER;
struct tinfoheader INFO;

unsigned char dgbuff[10000];/* 黑白图形文件大小,不能超过 */

void LoadDZ()
{
int i,ld;
char filename[20]={"1.bmp"};/*假设在当前目录下1.bmp文件 */
FILE *fp;

fp=fopen(filename,"rb");
fseek(fp,0,SEEK_SET);
fseek(fp,0,SEEK_END);
ld=ftell(fp);
fclose(fp);
fp=fopen(filename,"rb");
if(fp!=NULL)
{
fread(&dgbuff,ld,1,fp);
fclose(fp);
}
fp=fopen(filename,"rt");
if(fp!=NULL)
{
fread(&HEADER, sizeof(struct header), 1, fp);
fread(&INFO, sizeof(struct tinfoheader), 1, fp);
fclose(fp);
}
}

void show(int x,int y,int giColor,int backColor)/* 显示位置、前景色、背景色 */
{
int i,j,k,l=0,num,m,x0,x1,x2;
unsigned char b,c,c1;

if(HEADER.bfType!=0x4d42 || HEADER.bfReserved1!=0 || INFO.biSizeImage==0
|| INFO.biPlanes!=1 || INFO.biBitCount!=1 || INFO.biCompression!=0)
return;

m=INFO.biWidth/32;
if((INFO.biWidth%32)!=0) m=m+1;
num=HEADER.bfoffBits;

for(l=INFO.biHeight-1; l>=0; l--)
{
for (i=0;i<m;i++)
{
x0=i<<5;
for (j=0;j<4;j++)
{
x1=j<<3;
c=dgbuff[num];
num++;
for (k=7;k>=0;k--)
{
x2=x0+x1+7-k;
if(x2>=INFO.biWidth) continue;
else
{
b=1<<k;
c1=c&b;
if(c1==0)
{
putpixel(x+x2,y+l,giColor);
}
else
putpixel(x+x2,y+l,backColor);
}
}
}
}
}
}

void main()
{
int driver,mode;

driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,"");
setfillstyle(SOLID_FILL,WHITE);
bar(0,0,639,479);
LoadDZ();
show(200,200,RED,BLACK);
getch();
closegraph();
}
第3个回答  2011-06-28
你是要一位一位读取BMP文件数据吧?
我的建议是
有数组A[W][L]
fp=fopen(……)
for(i=0;i<w;i++)
for(j=l-1;j>=0;j--)
{
a[i][j]=fgetc(fp)
}
看是否能解答
相似回答