版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liouyi250/article/details/78863329
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. 效果图