使用C语言生成bitmap

版权声明:本文为博主原创文章,未经博主允许不得转载。 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. 效果图
这里写图片描述
这里写图片描述

连接: 使用C语言将24位彩色bitmap去色

猜你喜欢

转载自blog.csdn.net/liouyi250/article/details/78863329