Bitmap 图片格式并用 C++ 读写 Bitmap

来源:互联网 发布:中国银行mac控件手机版 编辑:程序博客网 时间:2024/06/15 10:29

1、Bitmap 图片格式

    每部分的具体内容就不展开了。要说的有两点:

    (1)调色板不是必须的,可有可无,有没有调色板可以通过位图文件头的 bfOffBits 是否等于位图文件头加上位图信息头的长度来判断。调色板这个问题也曾经导致我在用 C++ 读取 BMP 的时候出错,原因就是并不是每个图片都没有调色板的,我读取的开始位置错了。

    (2)windows 的 BMP 是从最后一行开始读的!这个问题曾经导致我在用 C++ 做图像的旋转时方向错误。

 

2、C++ 读取 Bitmap 图片

下面介绍三个简单的用 C++ 对 BMP 图片的操作

    (1)读取 BMP 图片

#include <stdio.h>#include <stdlib.h>#include <windows.h>typedef struct{    BYTE b;    BYTE g;    BYTE r;}RGB;void imgOpr(RGB &a,RGB &b){b.b=a.b;b.g=a.g;b.r=a.r;}int main(){    BITMAPFILEHEADER fileHeader;    BITMAPINFOHEADER infoHeader;    FILE* pfin =fopen("D:/1.bmp","rb");    FILE* pfout = fopen( "D:/2.bmp" , "wb");    //Read the Bitmap file header;    fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);    //Read the Bitmap info header;    fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);    //为简化代码,只处理24位彩色int height,weight;height=0;weight=0;height=infoHeader.biHeight;weight=infoHeader.biWidth;    if( infoHeader.biBitCount >= 1)    {        int size = height * weight;        RGB img[height][weight];        RGB img2[weight][height];        fread( img , sizeof(RGB) , size , pfin );                //对图片进行操作         int i, j;        for (i=0; i<height; i++) for (j=0 ; j < weight ; j++ ){//将数组 img 赋值给 img2 imgOpr(img[i][j],img2[i][j]);}                //将修改后的图片保存到文件         fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout );        fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout );        fwrite( img2 , sizeof(RGB) , size , pfout );    }    fclose(pfin);    fclose(pfout);return 0;}

 

    (2)旋转图片

#include <stdio.h>#include <stdlib.h>#include <windows.h>typedef struct{    BYTE b;    BYTE g;    BYTE r;}RGB;void imgOpr(RGB &a,RGB &b){b.b=a.b;b.g=a.g;b.r=a.r;}int main(){    BITMAPFILEHEADER fileHeader;    BITMAPINFOHEADER infoHeader;    FILE* pfin =fopen("D:/1.bmp","rb");    FILE* pfout = fopen( "D:/2.bmp" , "wb");    //Read the Bitmap file header;    fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);    //Read the Bitmap info header;    fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);    //为简化代码,只处理24位彩色int height,weight;height=0;weight=0;height=infoHeader.biHeight;weight=infoHeader.biWidth;    if( infoHeader.biBitCount >= 1)    {        int size = height * weight;        RGB img[height][weight];        RGB img2[weight][height];        fread( img , sizeof(RGB) , size , pfin );                //对图片进行操作         int i, j;        for (i=0; i<height; i++) for (j=0 ; j < weight ; j++ ){//将图片顺时针旋转90度 imgOpr(img[i][j],img2[weight-1-j][i]);}                //将修改后的图片保存到文件         fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout );        fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout );        fwrite( img2 , sizeof(RGB) , size , pfout );    }    fclose(pfin);    fclose(pfout);return 0;}

 

    (3)生成黑白图片

#include <stdio.h>#include <stdlib.h>#include <windows.h>typedef struct{    BYTE b;    BYTE g;    BYTE r;}RGB;RGB imgOpr(RGB a){RGB b;int t;t=(a.b+a.g+a.r)/3;b.b=t;b.g=t;b.r=t;return b;}int main(){    BITMAPFILEHEADER fileHeader;    BITMAPINFOHEADER infoHeader;    FILE* pfin =fopen("D:/1.bmp","rb");    FILE* pfout = fopen( "D:/2.bmp" , "wb");    //Read the Bitmap file header;    fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);    //Read the Bitmap info header;    fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);    //为简化代码,只处理24位彩色int height,weight;height=0;weight=0;height=infoHeader.biHeight;weight=infoHeader.biWidth;    if( infoHeader.biBitCount >= 1)    {        int size = height * weight;        RGB img[height][weight];;        fread( img , sizeof(RGB) , size , pfin );                //对图片进行操作         int i, j;        for (i=0; i<height; i++) for (j=0 ; j < weight ; j++ ){//将图片变成黑白图片 img[i][j]=imgOpr(img[i][j]);}                //将修改后的图片保存到文件         fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout );        fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout );        fwrite( img , sizeof(RGB) , size , pfout );    }    fclose(pfin);    fclose(pfout);return 0;}


 

0 0