【C++】————代码获取位图RGB值

实现方法介绍

1.对位图的信息头和文件头进行判断是否正确位图;
2.创建结构体储存rgb值,本身颜色数据存储顺序是反向的,所以结构体是bgr;
3.计算出一行的字节数:图片颜色字节数/列数=一行的字节数;
4.将获取的颜色存入结构体数组中,记得是反着放;
5.直接双循环输出,输出完毕要释放内存;

代码

#include <iostream>
#include <windows.h>
using namespace std;

char FileName[] = "test.bmp";

#define FILENAME FileName

typedef struct pixColor
{
	unsigned char b;
	unsigned char g;
	unsigned char r;
}PIXCOLOR,*PPIXCOLOR;

int main()
{
	BITMAPFILEHEADER bmf;
	BITMAPINFOHEADER bif;
	FILE* pf;
	
	//返回值为0表示打开成功,非0则为失败
	errno_t err = fopen_s(&pf,FILENAME, "rb");

	if (0 == err)
	{
		fread(&bmf, sizeof(bmf), 1, pf);
		fread(&bif, sizeof(bif), 1, pf);

		if (0x4d42 != bmf.bfType)
		{
			cout << "文件不是位图!" << endl;
			fclose(pf);
		}else if (24 != bif.biBitCount)
		{
			cout << "位图不是24位!" << endl;
			fclose(pf);
		}
		else
		{
			cout << "图片的宽度:" << bif.biWidth << endl;
			cout << "图片的高度:" << bif.biHeight << endl;

			PPIXCOLOR* ColorData = new PPIXCOLOR[bif.biHeight];

			//一行的字节数
			int lineCount = bif.biSizeImage / bif.biHeight;

			//存的时候从倒数第一行开始存,所以读的时候先往倒数第一行放
			//读颜色数据
			for (int i = bif.biHeight - 1; i >= 0; i--)
			{
				ColorData[i] = new PIXCOLOR[bif.biWidth];
				fread(ColorData[i], sizeof(PIXCOLOR), bif.biWidth, pf);
				//偏移  bif.biWidth * sizeof(PIXCOLOR)有多少个字节
				fseek(pf, lineCount - bif.biWidth * sizeof(PIXCOLOR), SEEK_CUR);
			}
			fclose(pf);

			for (int i = 0; i < bif.biHeight; i++)
			{
				for (int j = 0; j < bif.biWidth; j++)
				{
					printf("(%3d,%3d,%3d),", ColorData[i][j].r, ColorData[i][j].g, ColorData[i][j].b);
				}
				cout << endl;
				delete[] ColorData[i];
			}
			delete[] ColorData;
			ColorData = nullptr;
		}
	}





	system("pause");
	return 0;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页