1. 程式人生 > >使用C語言生成bitmap

使用C語言生成bitmap

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去色