用C语言在桌面上创建一副bmp图像

    bmp文件格式的约定在百度百科里说的很详细    

    http://baike.baidu.com/link?url=HHozGdrrizlbnoxnr8Ixry9YUW_bpBkZsYB9XtQazza9sHtBn5Teq3MceO_WobuYG1FX-1tZ-LZ35S8bss0GNrYrlqV52Xf_scA8tDa87Bi

    不过截止到我发帖为止,它里面的示例程序是错的,除非你的图像文件的每一行占用的字节数是4的倍数!

   还有一个错误的地方是:bmp的颜色表每一个占用3字节,分别为r,g,b三种颜色,没有第四个保留字节。

   下面的程序会在你的桌面上创建一个bmp的图像文件,可以直接打开,它是400*400像素的,只有一种颜色,而且为了缩短代码,以便更容易看清本质,我特意让它的每一行能让4整除(否则剩余的要用0补充),因为我们看到,一个像素3字节,一行400像素,所以一行1200字节,恰好能被4整除,省去了很多计算和代码。

  

#include <cstdio>
#include <windows.h>
BITMAPINFOHEADER info;
BITMAPFILEHEADER file;
RGBTRIPLE img;
FILE *p;
int main(){
    p=fopen("C:\\Users\\Administrator\\Desktop\\qui.bmp","wb");
    file.bfType=19778;
    file.bfSize=480054;
    file.bfOffBits=54;
    info.biSize=40;
    info.biWidth=400;
    info.biHeight=400;
    info.biPlanes=1;
    info.biBitCount=24;
    info.biCompression=0;
    info.biSizeImage=480000;
    img.rgbtRed=0xff;
    img.rgbtBlue=0x77;
    fwrite(&file,sizeof(file),1,p);
    fwrite(&info,sizeof(info),1,p);
    for(int i=0;i<info.biHeight;i++)
        for(int j=0;j<info.biWidth;j++)
            fwrite(&img,sizeof(img),1,p);
    return 0;
}
其中  BITMAPINFOHEADER  的结构为

typedef struct tagBITMAPINFOHEADER{
	DWORD	biSize;
	LONG	biWidth;
	LONG	biHeight;
	WORD	biPlanes;
	WORD	biBitCount;
	DWORD	biCompression;
	DWORD	biSizeImage;
	LONG	biXPelsPerMeter;
	LONG	biYPelsPerMeter;
	DWORD	biClrUsed;
	DWORD	biClrImportant;
} BITMAPINFOHEADER,*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;

BITMAPFILEHEADER  的结构为

</pre><pre name="code" class="cpp">typedef struct tagBITMAPFILEHEADER {
	WORD	bfType;
	DWORD	bfSize;
	WORD	bfReserved1;
	WORD	bfReserved2;
	DWORD	bfOffBits;
} BITMAPFILEHEADER,*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
RGBTRIPLE 的结构为

typedef struct tagRGBTRIPLE {
	BYTE rgbtBlue;
	BYTE rgbtGreen;
	BYTE rgbtRed;
} RGBTRIPLE,*LPRGBTRIPLE;

 这些都在<wingdi.h>中定义了,且<windows.h>中又包含了这个库,所以直接用了<windows.h>。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值