有了一些C++基础之后,就不免思考到,既然所有的东西在计算机的内存里面都是二进制保存的,那么我们电脑上显示的画面也应该有相应的设计保存方式,找了些资料贴下来供自己以后温习。看完过后不免对颜色有了更深的理解,三原色 加个深度饱和度啥的。。。其实也蛮简单的嘛。
//位图文件头结构体
struct BITMAPFILEHEADER{
WORD bfType; //文件类型,位图为'MB'
DWORD bfSize; //整个位图文件的大小
WORD bfReserved1;//
WORD bfReserved2;//
DWORD bfOffBits; //从文件头到颜色首地址的偏移值
};
//位图信息头结构体
struct BITMAPINFOHEADER
{
DWORD biSize; //本结构体的大小
LONG biWidth; //图片的像素宽
LONG biHeight; //图片的像素高
WORD biPlanes;
WORD biBitCount //颜色的色深(一个像素点的颜色用多少位来保存)
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
};
//颜色存储是从左下角开始,从左到右,从下往上存储的。
//为了加快访问速度,一行像素的存储大小必须是4的整数倍
struct RGB
{
char b;
char g;
char r;
};
void main()
{
FILE* fp;
fopen_s(&fp, "1.bmp","rb");
if (fp == 0)
return;
fseek(fp, 0, SEEK_END);
int size = ftell(fp);
fseek(fp, 0, SEEK_SET);
BITMAPFILEHEADER* p = (BITMAPFILEHEADER*)malloc(size);
fread(p, size, 1, fp);
fclose(fp);
std::cout<< ((char*)&(p->bfType))[0] <<std::endl;
std::cout<< ((char*)&(p->bfType))[1]<<std::endl;
std::cout<< p->bfSize <<std::endl;
std::cout<< p->bfOffBits <<std::endl;
BITMAPINFOHEADER* info = (BITMAPINFOHEADER*)(p+1);
std::cout<< info->biWidth<<std::endl;
std::cout<< info->biHeight<<std::endl;
RGB* color = (RGB*)((char*)p + p->bfOffBits);
int x = 3;
int y = 8;
RGB* c = (RGB*)((char*)color + (info->biHeight-1-y)*(3*info->biWidth) + x*3);
c->r = 255;
c->g = 255;
c->b = 123;
//[] <--- p
//[]
//[] BITMAPFILEHEADER head;
//[]
//[]
//[]
//[] BITMAPINFOHEADER info;
//[]
//[]
//[]
//[] RGB a;
//[]
//[]
//[]
//[] RGB a;
//[] RGB a;
//[]
//[]
//[]
//[] RGB a;
//[] RGB a;
//[]
//[]
//[]
//[] RGB a;
//[] RGB a;
//[]
//[]
//[]
//[] ABC a;
}