C语言如何生成位图文件

时间:2020-11-29 11:49:03
1.一个是Bitmapfileheader和bitmapinfoheader这两个结构定义中,Vc下DWORD,LONG类型,C语言如何定义?
2.再有bisize是一定为40?biXPelsPerMeter水平分辨率,biYPelsPerMeter垂直分辨率如何设?biClrUsed,biClrImportant有是什么呢?我的位图文件是纯黑白的,那biBitCount是不是就是1了呢?
非常感谢~

11 个解决方案

#1


这为仁兄,我也正希望有人能解答这个问题

#2


如果只是想用C写,但还是Windows程序那就好办。
LONG就是long
DWORD就是unsigned long
bisize是一定为40,这是该结构体决定的,你可以自己算一算。该结构体如下:
typedef struct tagBITMAPINFOHEADER{
DWORD  biSize;            // 本结构所占用字节数
LONG   biWidth;           // 位图的宽度,以像素为单位
LONG   biHeight;          // 位图的高度,以像素为单位
WORD   biPlanes;          // 目标设备的级别,必须为1
WORD   biBitCount         // 每个像素所需的位数,必须是1(双色),
          // 4(16色),8(256色)或24(真彩色)之一
DWORD  biCompression;     // 位图压缩类型,必须是 0(不压缩),
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD  biSizeImage;       // 位图的大小,以字节为单位
LONG   biXPelsPerMeter;   // 位图水平分辨率,每米像素数
LONG   biYPelsPerMeter;   // 位图垂直分辨率,每米像素数
DWORD  biClrUsed;         // 位图实际使用的颜色表中的颜色数
DWORD  biClrImportant;    // 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;

你自己生成位图的话,分辨率是可知的呀,它跟你的要求相关嘛。

biBitCount是描述你的文件格式比如16色,256色,24位真彩。它决定了颜色的最大量,而不是你实际使用的颜色量。所以黑白图片也可以是1,4,8,16,24等等。

#3


补充水明,用TC2.0也是可以写出生成一副位图的程序来的。(特意提TC2.0是想表明这是纯粹的C程序,不过这样它也是一个DOS程序)

#4


en ~~~~~~多谢多谢~

#5


那,给分呀?:-)

#6


sorry,暂还不给分啊~~~:)
还有点问题就是我现在写出来的位图文件可以用画图板打开,但无任何显示,是张空白的图,是不是头里什么部分没写对呢?
bmpinfoheader.biSize=40;//sizeof(bmpinfoheader);
bmpinfoheader.biWidth=4776;//A4的大小
bmpinfoheader.biHeight=6832;
bmpinfoheader.biPlanes=1;
bmpinfoheader.biBitCount=1;
bmpinfoheader.biCompression=0;//"BI_RGB";
bmpinfoheader.biSizeImage=0;
bmpinfoheader.biXPelsPerMeter=600;///*points/metre*/
bmpinfoheader.biYPelsPerMeter=600;///*points/metre*/
bmpinfoheader.biClrUsed=0;
bmpinfoheader.biClrImportant=0;

bmpfileheader.bfType=0x4d42;//ASCII "B""M"
bmpfileheader.bfReserved1=bmpfileheader.bfReserved2=0;
bmpfileheader.bfOffBits=sizeof(BMPFILEHEADER)+sizeof(BMPINFOHEADER)+2*sizeof(RGBQUAD);//黑白色,所以只有两个RGBQUAD数组
bmpfileheader.bfSize=(bmpfileheader.bfOffBits+bmpfile)/4;//bmpfile是图像阵列的大小

看看有那儿不对呢?谢喽~~~~

#7


biWidth,biHeight不对,它的单位是像素。biBitCount=1的话,就是2色图,一般是黑白图,当然有可能显示的是一张空白图了。你想要什么结果?全黑?

#8


我的是一副A4大小的图,宽高就是以象素为单位的呀,也就是4776和6832。而且是纯黑白的图,图像阵列中有黑色的,也就是想要一张有黑也有白的。:)再有,这个水平分辨率指的是不是显示设备的分辨率呢?也就是说是我所用的屏幕的?因为我想现成的画图板做出的纯黑白图,修改起头信息中的分辨率,发现并没有什么改变。

#9


对了忘了说了,bfSize是不是文件大小/4?还是就是整个文件大小?分析现成例子好象就是整个文件的大小。

#10


学习中
!:)

#11


hoho~我又摸索了一下,确认文件大小就是头信息加上图像阵列的大小;再有图像阵列像素需要4字节对齐,也就是说每行的字节数应该是4的倍数,不足的补0.

#1


这为仁兄,我也正希望有人能解答这个问题

#2


如果只是想用C写,但还是Windows程序那就好办。
LONG就是long
DWORD就是unsigned long
bisize是一定为40,这是该结构体决定的,你可以自己算一算。该结构体如下:
typedef struct tagBITMAPINFOHEADER{
DWORD  biSize;            // 本结构所占用字节数
LONG   biWidth;           // 位图的宽度,以像素为单位
LONG   biHeight;          // 位图的高度,以像素为单位
WORD   biPlanes;          // 目标设备的级别,必须为1
WORD   biBitCount         // 每个像素所需的位数,必须是1(双色),
          // 4(16色),8(256色)或24(真彩色)之一
DWORD  biCompression;     // 位图压缩类型,必须是 0(不压缩),
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD  biSizeImage;       // 位图的大小,以字节为单位
LONG   biXPelsPerMeter;   // 位图水平分辨率,每米像素数
LONG   biYPelsPerMeter;   // 位图垂直分辨率,每米像素数
DWORD  biClrUsed;         // 位图实际使用的颜色表中的颜色数
DWORD  biClrImportant;    // 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;

你自己生成位图的话,分辨率是可知的呀,它跟你的要求相关嘛。

biBitCount是描述你的文件格式比如16色,256色,24位真彩。它决定了颜色的最大量,而不是你实际使用的颜色量。所以黑白图片也可以是1,4,8,16,24等等。

#3


补充水明,用TC2.0也是可以写出生成一副位图的程序来的。(特意提TC2.0是想表明这是纯粹的C程序,不过这样它也是一个DOS程序)

#4


en ~~~~~~多谢多谢~

#5


那,给分呀?:-)

#6


sorry,暂还不给分啊~~~:)
还有点问题就是我现在写出来的位图文件可以用画图板打开,但无任何显示,是张空白的图,是不是头里什么部分没写对呢?
bmpinfoheader.biSize=40;//sizeof(bmpinfoheader);
bmpinfoheader.biWidth=4776;//A4的大小
bmpinfoheader.biHeight=6832;
bmpinfoheader.biPlanes=1;
bmpinfoheader.biBitCount=1;
bmpinfoheader.biCompression=0;//"BI_RGB";
bmpinfoheader.biSizeImage=0;
bmpinfoheader.biXPelsPerMeter=600;///*points/metre*/
bmpinfoheader.biYPelsPerMeter=600;///*points/metre*/
bmpinfoheader.biClrUsed=0;
bmpinfoheader.biClrImportant=0;

bmpfileheader.bfType=0x4d42;//ASCII "B""M"
bmpfileheader.bfReserved1=bmpfileheader.bfReserved2=0;
bmpfileheader.bfOffBits=sizeof(BMPFILEHEADER)+sizeof(BMPINFOHEADER)+2*sizeof(RGBQUAD);//黑白色,所以只有两个RGBQUAD数组
bmpfileheader.bfSize=(bmpfileheader.bfOffBits+bmpfile)/4;//bmpfile是图像阵列的大小

看看有那儿不对呢?谢喽~~~~

#7


biWidth,biHeight不对,它的单位是像素。biBitCount=1的话,就是2色图,一般是黑白图,当然有可能显示的是一张空白图了。你想要什么结果?全黑?

#8


我的是一副A4大小的图,宽高就是以象素为单位的呀,也就是4776和6832。而且是纯黑白的图,图像阵列中有黑色的,也就是想要一张有黑也有白的。:)再有,这个水平分辨率指的是不是显示设备的分辨率呢?也就是说是我所用的屏幕的?因为我想现成的画图板做出的纯黑白图,修改起头信息中的分辨率,发现并没有什么改变。

#9


对了忘了说了,bfSize是不是文件大小/4?还是就是整个文件大小?分析现成例子好象就是整个文件的大小。

#10


学习中
!:)

#11


hoho~我又摸索了一下,确认文件大小就是头信息加上图像阵列的大小;再有图像阵列像素需要4字节对齐,也就是说每行的字节数应该是4的倍数,不足的补0.