使用C語言生成bitmap
阿新 • • 發佈:2018-11-11
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. 效果圖