您的位置:首页 > 编程语言 > C语言/C++

使用C语言生成bitmap

2017-12-21 14:19 120 查看
bitmap基本知识连接,不多说

https://www.cnblogs.com/ZXNblog/p/4046342.html

这篇讲述怎么用C语言生成bitmap

1. 包含头文件

include <stdio.h>
include <windows.h>
include <stdlib.h>
include <math.h>
define PI 3.1415926
typedef unsigned char uc;


2. 在主函数定义两个信息文件结构体并赋初值

int main(){
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;

fileHeader.bfType=0x4D42;//类型,代表bitmap
fileHeader.bfReserved1=0;//保留字1(初值)
fileHeader.bfReserved2=0;//保留字2(初值)
fileHeader.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);//偏移量
/* fileHeader.bfSize没有赋值 */
infoHeader.biBitCount=24;//24位位图
infoHeader.biClrImportant=0;//重要颜色,0代表都重要(初值)
infoHeader.biClrUsed=0;//使用过的颜色(初值)
infoHeader.biCompression=0;//没有被压缩
infoHeader.biPlanes=1;//平面数(初值)
infoHeader.biXPelsPerMeter=0;//x方向分辨率(初值)
infoHeader.biYPelsPerMeter=0;//y方向分辨率(初值)
}


3. 定义绘画函数,并在函数内确定图像的具体信息(drawColor函数是生成所有的颜色图像,drawSin是绘制sin函数图像)

void drawColor(BITMAPFILEHEADER *fileHeader,BITMAPINFOHEADER *infoHeader){
// RGB组合共有 256*256*256种 组合
int r,g,b;
int width=256*16;
int height=256*16;
int stride=((24*width)>>5)<<2;//取4的整数倍数
fileHeader->bfSize=fileHeader->bfOffBits+height*stride;//文件大小

infoHeader->biHeight=height;
infoHeader->biWidth=width;
infoHeader->biSizeImage=stride*height;//图像大小
infoHeader->biSize=sizeof(BITMAPINFOHEADER);//结构体大小

/*下面开始写位图 */
FILE* fp=fopen("color.bmp","wb");
fwrite(fileHeader,sizeof(BITMAPFILEHEADER),1,fp);//写文件头
fwrite(infoHeader,sizeof(BITMAPINFOHEADER),1,fp);//写信息头

uc *array=(uc*)malloc(stride); //分配空间
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
r=(i+1)*j/256/256;
g=i/16;
b=255-i*j%256;
array[3*j]=(uc)r;
array[3*j+1]=(uc)g;
array[3*j+2]=(uc)b;
}
fwrite(array,1,stride,fp);
}
fclose(fp);
free(array);
array=NULL;
}

void drawSin(BITMAPFILEHEADER *fileHeader,BITMAPINFOHEADER *infoHeader){
int r,g,b;
int width=1000;
int height=1000;
int stride=((24*width)>>5)<<2;//取4的整数倍数
fileHeader->bfSize=fileHeader->bfOffBits+height*stride;//文件大小

infoHeader->biHeight=height;
infoHeader->biWidth=width;
infoHeader->biSizeImage=stride*height;//图像大小
infoHeader->biSize=sizeof(BITMAPINFOHEADER);//结构体大小

/*下面开始写位图 */
FILE* fp=fopen("sin.bmp","wb");
fwrite(fileHeader,sizeof(BITMAPFILEHEADER),1,fp);//写文件头
fwrite(infoHeader,sizeof(BITMAPINFOHEADER),1,fp);//写信息头

uc *array=(uc*)malloc(stride); //分配空间
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
array[3*j]=(uc)255;//底图变白
array[3*j+1]=(uc)255;
array[3*j+2]=(uc)255;
if(i==500+int(400*sin(0.8*j*PI/180))){
array[3*j+1]=array[3*j]=0;
array[3*j+2]=(uc)255;
printf("%d %d\n",i,j);
}
}
fwrite(array,1,stride,fp);
}
fclose(fp);
free(array);
array=NULL;
}


4. 主函数调用两个函数

drawColor(&fileHeader,&infoHeader);
drawSin(&fileHeader,&infoHeader);


5. 效果图





连接: 使用C语言将24位彩色bitmap去色
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 位图
相关文章推荐