任务:用c++编程语言读取解析示例图片(这里以bmp格式图片为例),并进行显示和输出图片宽度和高度的操作(这里用控制台窗口进行显示)。
图片:
思路:
- 把图片以文件形式打开。
- 查阅BMP格式,对文件进行解析,读取图片宽、高、像素值等信息。
- 文件指针跳转到图像数据起始位置,读取RGB值,并利用SetPixel()函数在控制台绘制图像。
注意:
有的编译环境中调用SetPixel()函数,除了已写的头文件,还需要手动包含静态库。如cmd编译时用指令
g++ bmpshow.cpp -o bmpshow.exe -lgdi32 -std=c++17
(其中“bmpshow.cpp”为cpp文件名)
代码:
#include<Windows.h> #include<mbstring.h> #include<malloc.h> #include<stdlib.h> #include<stdio.h> #include<iostream> using namespace std; int main() { char ImageName[30]="image.bmp"; //定义打开图像名字 FILE* fp; //定义图片件指针 char* buf; //定义文件读取缓冲区 char *p; //实现死循环辅助指针 int r, g, b; //RGB值 DWORD w, h; //定义读取图像的长和宽 WORD biBitCount; //说明比特数/像素,其值为1、4、8、16、24、或32 BITMAPFILEHEADER bf; //图像文件头 UINT bftype; // 图像类型 BITMAPINFOHEADER bi; //图像文件头信息 fp = fopen(ImageName, "rb"); //打开文件(图像和cpp文件在一个目录下) if(fp==NULL) { cout << "Open file ERROR!" << endl; exit(0); } fread(&bf, sizeof(BITMAPFILEHEADER), 1, fp);//读取BMP文件头文件 bftype = bf.bfType; if(bftype!=0x4D42) { cout << "Image Type Wrong!" << endl; exit(0); } fread(&bi, sizeof(BITMAPINFOHEADER), 1, fp);//读取BMP文件头文件信息 w = bi.biWidth; //获取图像的宽 h = bi.biHeight; //获取图像的高 如果该值是一个正数说明图像是倒向的,如果该值是一个负数则说明图像是正向的 biBitCount = bi.biBitCount; //获取图像像素 //biBitCount=24 表示位图最多有1670万种颜色。在位数组中,每3个字节代表一个像素,分别对应于颜色R、G、B。 cout << "Image_Width:" << w << endl; cout << "Image_Height:" << h ; // cout << biBitCount << endl; if(biBitCount!=24) { cout << "biBitCount is not 24!" << endl; exit(0); } buf = (char*)malloc(w * h * 3); //分配缓冲区大小 在位数组中,每3个字节代表一个像素 fseek(fp, long(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)), 0);//定位到位图数据像素起始位置 fread(buf, 1, w * h * 3, fp); //开始读取数据 //绘制图片 HWND consoleWindow = GetConsoleWindow(); //获取窗口句柄 HDC consoleDC = GetDC(consoleWindow); int x = 0; int y = 40; //w,h,输出让位置 while (true) //防止SetPixel()函数绘制像素值后会消失 { p = buf; for (DWORD j = 0; j < h; j++) { for (DWORD i = 0; i < w; i++) { b = *p++; g = *p++; r = *p++; SetPixel(consoleDC, x + i, y + h - j, RGB(r, g, b)); // 图像倒向 } } } fclose(fp); system("pause"); return 0; }
运行截图不在这里展示了,有兴趣的朋友可以自己尝试运行~