C语言如何用数组保存1位BMP图的位图数据?8个元素由一个字节保存 不会读取- -
要不要用到BMP图的颜色表?
然后如何显示出来?打算用putpixel函数画点....不过总不成功
求解
不用颜色索引可以的吗?..反正就黑白两种色
如果用二维数组保存可以直接用fread保存到一个二维数组中吗?
数组的大小为 宽*高/64?..
可以,但
位图是数据的宽跟像素的宽不一定相等的。
位图中定义了数据的宽必须是4个字节的倍数,一行的像素所用的字节数不是4的倍数时要在后面补齐为4的倍数
比如 ,你的1位深的图,假设像素为24*100。
那么数据是这样的 1位深是用位来表示一个像素的 ,一行是24个像素,那么就是用3个字节字节就可以表示了 ,但由于需要不齐,那么就是 4个字节,32位,
位图数据的大小为4*100个字节,而不是3*100个字节
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++)