C++實(shí)現(xiàn)bmp格式圖像讀寫(xiě)
bmp格式圖像有一個(gè)特點(diǎn)就是這類(lèi)數(shù)據(jù)被分為四個(gè)部分:
1.位圖文件頭(Bitmap File Header) ,大?。?4字節(jié)
主要包括位圖文件大小和位圖文件類(lèi)型信息
2.位圖信息頭(Bitmap Info Header),大?。?0字節(jié)
主要包括:位圖的寬度和高度,像素為單位、每個(gè)像素所占位數(shù)(1黑白圖像),(4-16色圖)、(8-256色圖)、(24-真彩色圖),新的BMP格式可以支持32位色。 還有其它水平和垂直分辨力(單位:像素/米)等
3.顏色表(Color Map),大?。?個(gè)字節(jié)
三大類(lèi):藍(lán)色分量、綠色分量、紅色分量
4.位圖數(shù)據(jù)(Data Body)
對(duì)于2色位圖用1位就可以表示該像素,那么1個(gè)字節(jié)就可以?xún)?chǔ)存8個(gè)像素的顏色值
對(duì)于16色位圖,用4個(gè)字節(jié)表示一個(gè)像素顏色,那么一個(gè)字節(jié)可以?xún)?chǔ)存2個(gè)像素顏色值
對(duì)于256色位圖,1個(gè)字節(jié)剛好儲(chǔ)存1個(gè)像素的顏色值
對(duì)于真彩色位圖,則需要3個(gè)字節(jié)才能表示一個(gè)像素的顏色值
1.讀bmp圖像
bool readBmp(char *bmpName) { //二進(jìn)制讀方式打開(kāi)指定的圖像文件 FILE *fp=fopen(bmpName,"rb"); if(fp==0) return 0; //跳過(guò)位圖文件頭結(jié)構(gòu)BITMAPFILEHEADER fseek(fp, sizeof(BITMAPFILEHEADER),0); //定義位圖信息頭結(jié)構(gòu)變量,讀取位圖信息頭進(jìn)內(nèi)存,存放在變量head中 BITMAPINFOHEADER head; fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //獲取圖像寬、高、每像素所占位數(shù)等信息 bmpWidth = head.biWidth; bmpHeight = head.biHeight; biBitCount = head.biBitCount; //定義變量,計(jì)算圖像每行像素所占的字節(jié)數(shù)(必須是4的倍數(shù)) int lineByte=(bmpWidth * biBitCount/8+3)/4*4; //灰度圖像有顏色表,且顏色表表項(xiàng)為256 if(biBitCount==8){ //申請(qǐng)顏色表所需要的空間,讀顏色表進(jìn)內(nèi)存 pColorTable=new RGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp); } //申請(qǐng)位圖數(shù)據(jù)所需要的空間,讀位圖數(shù)據(jù)進(jìn)內(nèi)存 pBmpBuf=new unsigned char[lineByte * bmpHeight]; fread(pBmpBuf,1,lineByte * bmpHeight,fp); //關(guān)閉文件 fclose(fp); return 1; }
2.寫(xiě)bmp圖像
bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable) { //如果位圖數(shù)據(jù)指針為0,則沒(méi)有數(shù)據(jù)傳入,函數(shù)返回 if(!imgBuf) return 0; //顏色表大小,以字節(jié)為單位,灰度圖像顏色表為1024字節(jié),彩色圖像顏色表大小為0 int colorTablesize=0; if(biBitCount==8) colorTablesize=1024; //待存儲(chǔ)圖像數(shù)據(jù)每行字節(jié)數(shù)為4的倍數(shù) int lineByte=(width * biBitCount/8+3)/4*4; //以二進(jìn)制寫(xiě)的方式打開(kāi)文件 FILE *fp=fopen(bmpName,"wb"); if(fp==0) return 0; //申請(qǐng)位圖文件頭結(jié)構(gòu)變量,填寫(xiě)文件頭信息 BITMAPFILEHEADER fileHead; fileHead.bfType = 0x4D42;//bmp類(lèi)型 //bfSize是圖像文件4個(gè)組成部分之和 fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height; fileHead.bfReserved1 = 0; fileHead.bfReserved2 = 0; //bfOffBits是圖像文件前三個(gè)部分所需空間之和 fileHead.bfOffBits=54+colorTablesize; //寫(xiě)文件頭進(jìn)文件 fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); //申請(qǐng)位圖信息頭結(jié)構(gòu)變量,填寫(xiě)信息頭信息 BITMAPINFOHEADER head; head.biBitCount=biBitCount; head.biClrImportant=0; head.biClrUsed=0; head.biCompression=0; head.biHeight=height; head.biPlanes=1; head.biSize=40; head.biSizeImage=lineByte*height; head.biWidth=width; head.biXPelsPerMeter=0; head.biYPelsPerMeter=0; //寫(xiě)位圖信息頭進(jìn)內(nèi)存 fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp); //如果灰度圖像,有顏色表,寫(xiě)入文件 if(biBitCount==8) fwrite(pColorTable, sizeof(RGBQUAD),256, fp); //寫(xiě)位圖數(shù)據(jù)進(jìn)文件 fwrite(imgBuf, height*lineByte, 1, fp); //關(guān)閉文件 fclose(fp); return 1; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了c語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01win10系統(tǒng)VS2019配置點(diǎn)云庫(kù)PCL1.12.1的詳細(xì)流程
這篇文章主要介紹了win10系統(tǒng)VS2019配置點(diǎn)云庫(kù)PCL1.12.1的教程與經(jīng)驗(yàn)總結(jié),本文記錄小白在配置過(guò)程中踩過(guò)的一些小坑,需要的朋友可以參考下2022-07-07opencv實(shí)現(xiàn)棋盤(pán)格檢測(cè)
這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)棋盤(pán)格檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++中inet_pton、inet_ntop函數(shù)的用法
這篇文章主要介紹了C++中inet_pton、inet_ntop函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08用c語(yǔ)言實(shí)現(xiàn)《狼人殺》游戲發(fā)牌系統(tǒng)
大家好,本篇文章主要講的是用c語(yǔ)言實(shí)現(xiàn)《狼人殺》游戲發(fā)牌系統(tǒng),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01深入分析Visual C++進(jìn)行串口通信編程的詳解
本篇文章是對(duì)Visual C++進(jìn)行串口通信編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05