大作业-点灯机器人-记录心得(2)-----基础铺垫-bmp相关
--------------------------12月2日--------------------------------------------------------------------------------------------
今天我將繼續復習bmp文件相關的東西/基礎知識與實際應用/了解其底層原理/理清一些寫的時候的易錯事項
_____________________________________________________________________________
let's go!
一 一些基礎性的東西-----看一段程序----你就懂了!
#include<iostream> #include<fstream>//包含頭文件 using namespace std; # pragma pack(1);//使得所有屬性的首地址都是1的倍數即可,防止編譯器“善意”添補 struct BMPFileHeader{char id[2];//B,M int size;//文件長度 short save1;//保留字段,四字節 short save2;int offset;//像素偏移 };//此結構體與下一結構體都是一個bmp文件的最基本的東西,有了它們才能被識別為bmp文件 # pragma pack(1); struct BMPInfoHeader{int headsize;//信息頭長度 int wid;//x int hei;//y short image_pile;//圖層,沒有用 short pixel_position;//每像素位 --24 代表每個顏色用3個字節表示,對應到下面//也就是三個 unsigned char int nothing;//壓縮算法 int pixel_byte;int x_fbl;int y_fbl;int board_colour;int printer; }; struct pixel{unsigned char b,g,r; };//rgb 每個像素的色彩由這三個東西共同構成 pixel content[300][400];//這個是由實際需求決定的 用二維數組的方式更方便讀入每個像素的數據 int main () {ofstream cell;cell.open("cell_exist_light.bmp",ios::binary);BMPFileHeader bfh={{'B','M'},400*300*3+0x36,0,0,0x36};BMPInfoHeader bih={0x28,400,300,1,24,0,400*300*3,0};cell.write((char*)&bfh,14);cell.write((char*)&bih,40);//指針強轉for(int y=299;y>=0;y--){for(int x=0;x<400;x++){content[y][x].b=255;content[y][x].g=255;content[y][x].r=255;}}//寫了一個白色背景for(int i=150,j=30;i>=65;i--,j+=2){//寫循環 for(int y=i,x=j;y<i+85;y++,x+=2){content[y][x].b=0;content[y][x].g=255;content[y][x].r=255;content[y-1][x-1].b=0;content[y-1][x-1].g=255;content[y-1][x-1].r=255;content[y-1][x].b=0;content[y-1][x].g=255;content[y-1][x].r=255;content[y][x-1].b=0;content[y][x-1].g=255;content[y][x-1].r=255; }}cell.write((char*)content,sizeof(content));//把我寫到數組里的那堆東西讀入文//件,文件按照預定好的解釋方式顯示出了對應的圖片cell.close();return 0; }二. 一些細節以及比較ex的東西(部分于上方程序中體現)
1.在讀入數據時,原點在左下方,先讀行后讀列(只需看準數組的二維與之對應即可---也就是第一維是x,外面才是y,定好這個之后只需關注絕對位置即可)
2.計算機的ex的自動補齊機制-----有一種不好叫做計算機覺得這數不好
如果一行的像素不是四的倍數的時候,計算機會自動給你補齊為四的倍數-----------這個時候就要小心了,否則圖像可能就不像你期望的那樣生成了
3,還是編譯器干的壞事-----------它覺得訪問2,4,8的倍數的地址更快,所以在進行結構體定義的時候,這東西會給你默認填補使得
每一個? int? 的 首地址都是? ? 4? ?的倍數
? ? ? ? ? ? ?short? ? ? ? ? ? ? ? ? ? ? ? 2??
? ? ? ? ? ? char? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ? ? ? ? double? ? ? ? ? ? ? ? ? ? ? ?8? ? ? ? ? ? ? ? ? ? ? ? ?你占多大字節,就讓你的首地址是多少的倍數
怎么對付它呢?
#pragma pack(1); 解釋同上
4. 大端與小端-------------多字節數據在內存中的存放順序問題
bmp中 讀取圖像寬度時候從右往左讀? 并且注意是16進制即可??
這次就寫這么一點點,告一段落,之后來繼續進行深入研究
總結
以上是生活随笔為你收集整理的大作业-点灯机器人-记录心得(2)-----基础铺垫-bmp相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序前几天wx.getUserInfo
- 下一篇: SAP 预制发票凭证