零基础之位图(理解计算机图像用)

有了一些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::cout<< ((char*)&(p->bfType))[1]< std::cout<< p->bfSize < std::cout<< p->bfOffBits <

BITMAPINFOHEADER* info = (BITMAPINFOHEADER*)(p+1);
std::cout<< info->biWidth< std::cout<< info->biHeight<
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;
}

你可能感兴趣的:(位图)