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等等。
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是图像阵列的大小
看看有那儿不对呢?谢喽~~~~
还有点问题就是我现在写出来的位图文件可以用画图板打开,但无任何显示,是张空白的图,是不是头里什么部分没写对呢?
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等等。
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是图像阵列的大小
看看有那儿不对呢?谢喽~~~~
还有点问题就是我现在写出来的位图文件可以用画图板打开,但无任何显示,是张空白的图,是不是头里什么部分没写对呢?
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.