# BMPImage **Repository Path**: Mannix1994/BMPImage ## Basic Information - **Project Name**: BMPImage - **Description**: BMP图像的读取、保存创建黑色BMP图像、修改BMP的像素 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: https://gitee.com/Mannix1994/BMPImage - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2018-05-15 - **Last Updated**: 2022-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BMPImage 本项目实现了读取、保存、新建BMP图像和修改访问BMP某一像素的类。 自己实现的数据结构,没有使用其他头文件,理论上是跨平台的。需 要注意的是文件编码,VS需要使用UTF-8 with BOM,gcc或者Linux平 台要使用UTF-8。 #### 一、实现过程 #### 说下我的思路,首先查阅BMP图像的文件格式,根据格式写出BMP图像 的文件头、信息头等数据结构,然后在写出读BMP图像的代码;然后再 写出保存BMP图像的代码;然后在写出创建BMP图像的代码;最后写出 修改访问BMP图像的代码。 给出参考链接: [BMP格式详解](https://blog.csdn.net/u012877472/article/details/50272771) (准确,非常推荐)、 [BMP文件格式](https://blog.csdn.net/lanbing510/article/details/8176231) (写出了字节数等信息,第4点有错误)。 #### 二、BMP组成 #### BMP图像文件是二进制文件,组成为:BMP文件头(BMPFileHeader)、 BMP信息头(BMPInfoHeader)、调色板(Color Palette,可选,不是 必有的)、图像的实际数据。所以读取和保存BMP图像的顺序为:BMP 文件头、BMP信息头、调色板(如果有)、图像数据。 #### 三、使用教程 #### 1. 下载本项目,将其中的BMPImage.h和BMPImage.cpp复制到你的项 目中,需要注意的是,在VS里面,需要把代码文件的编码转换为UTF-8 with BOM,否则程序不能正常运行。 2. 创建一张8位纯黑的图像 ```cplusplus #include "BMPImage.h" void fun(){ // -----------第一种方式---------- BMPImage bmp(500,500,8); //创建失败会抛出异常 // -----------第二种方式---------- BMPImage bmp_1; bmp_1.create(101,101,8); //创建失败返回false } ``` 3. 创建一张24位纯黑的图像 ```cplusplus #include "BMPImage.h" void fun(){ // -----------第一种方式---------- BMPImage bmp(500,500); //创建失败会抛出异常 // -----------第二种方式---------- BMPImage bmp_1; bmp_1.create(101,101); //创建失败返回false } ``` 4. 创建一张32位的纯黑图像 ```cplusplus #include "BMPImage.h" void fun(){ // -----------第一种方式---------- BMPImage bmp(500,500,32); //创建失败会抛出异常 // -----------第二种方式---------- BMPImage bmp_1; bmp_1.create(101,101,32); //创建失败返回false } ``` 5. 打开一张BMP图像 ```cplusplus #include "BMPImage.h" void fun{ // ----------第一种方式-------------- BMPImage bmpImage1("../No.bmp"); //打开失败会抛出异常 // ----------第二种方式-------------- BMPImage bmpImage2; bmpImage2.open("../No.bmp"); //打开失败会返回false } ``` 6. 访问某一像素 ```cplusplus #include "BMPImage.h" void fun{ BMPImage bmpImage1("../No.bmp"); // 访问某一像素 if(bmpImage1.depth()==8){ uchar value = bmpImage1.at(0,0); printf("(Gray:%d)\n",value); } else if(bmpImage1.depth() == 24) {//三通道图像 BGR value = bmpImage1.at(0, 0); printf("(B:%d,G:%d,R:%d)\n",value.b,value.g,value.r); }else if (bmpImage1.depth() == 32){//BGR+Alpha通道 BGRA value = bmpImage1.at(0,0); printf("(B:%d,G:%d,R:%d,A:%d)\n",value.b,value.g,value.r,value.a); } } ``` 7. 修改某些像素 ```cplusplus #include "BMPImage.h" void fun{ BMPImage bmpImage1("../No.bmp"); // 修改某些像素 if(bmpImage1.depth()==8){ for(uint4 i = 100;i<200;i++){ for(uint4 j = 100;j<200;j++){ bmpImage1.at(i, j) = 255; } } } else if(bmpImage1.depth() == 24) {//三通道图像 BGR bgr{0,255,0}; for(uint4 i = 100;i<200;i++){ for(uint4 j = 100;j<200;j++){ bmpImage1.at(i, j) = bgr; } } }else if (bmpImage1.depth() == 32){//BGR+Alpha通道 BGRA bgra{0,255,0,255}; for(uint4 i = 100;i<200;i++){ for(uint4 j = 100;j<200;j++){ bmpImage1.at(i, j) = bgra; } } } } ``` 8. 保存 ```cplusplus #include "BMPImage.h" void fun(){ BMPImage bmp24_101; bmp24_101.create(101,101); bmp24_101.save("../24_101.bmp"); BGR green = {0,255,0}; // 将左上的50*20像素修改为绿色 for(uint4 i = 0;i<50;i++){ for(uint4 j = 0;j<20;j++){ bmp24_101.bgr(i, j) = green; } } // 保存 bmp24_101.save("../24_101_1.bmp"); } ``` #### 四、关于作者 #### ```javascript var whoAmI = { name : "Mannix1994", gitee : "https://gitee.com/Mannix1994", github : "https://github.com/Mannix1994" } ```