




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第二課 bmp圖片格式解析<一>.BMP格式定義BMP文件格式是Windows操作系統(tǒng)推薦和支持的圖像文件格式,是一種將內(nèi)存或顯示器的圖像數(shù)據(jù)不經(jīng)過壓縮而直接按位存盤的文件格式,故稱位圖(bitmap),其擴(kuò)展名為BMP。BMP圖像文件被分為4個(gè)部分:a.位圖文件頭 b.位圖信息頭 c.顏色表 d.位圖數(shù)據(jù)a.顏色表中RGBQUAD結(jié)構(gòu)數(shù)據(jù)的個(gè)數(shù)有biBitCount來確定:當(dāng)biBitCount=1,4,8時(shí),分別有2,16,256個(gè)表項(xiàng);當(dāng)biBitCount=24時(shí),沒有顏色表項(xiàng)。位圖信息頭和顏色表組成位圖信息,BITMAPINFO結(jié)構(gòu)定義如下:typedef struct
2、tagBITMAPINFO BITMAPINFOHEADER bmiHeader; / 位圖信息頭RGBQUAD bmiColors1; / 顏色表 BITMAPINFO;b.位圖數(shù)據(jù)位圖數(shù)據(jù)記錄了位圖的每一個(gè)像素值,記錄順序是在掃描行內(nèi)是從左到右,掃描行之間是從下到上。位圖的一個(gè)像素值所占的字節(jié)數(shù): 當(dāng)biBitCount=1時(shí),8個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=4時(shí),2個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=8時(shí),1個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=24時(shí),1個(gè)像素占3個(gè)字節(jié);Windows規(guī)定一個(gè)掃描行所占的字節(jié)數(shù)必須是4的倍數(shù)(即以long為單位),不足的以0填充,
3、biSizeImage = (bi.biWidth * bi.biBitCount) + 31) & 31) / 8) * bi.biHeight。<二>.BMP圖片在MFC工程中的定義存在2個(gè)未解問題:a. bmp結(jié)構(gòu)時(shí)我定義成系統(tǒng)自帶的結(jié)構(gòu),否則會多2個(gè)字節(jié)在圖片最后為CD;b. 在read中malloc只能申請4字節(jié)的空間,但fread(,m_nImage,)讀入位圖大小個(gè)。第一步:添加BMP信息文件頭文件新建創(chuàng)建ImageStruct.h包含BMP格式的文件頭部分的結(jié)構(gòu)。打開ImageStruct.h并添加代碼:重點(diǎn)注意:1.bmp結(jié)構(gòu)頭必須定義成BITMAPFIL
4、EHEADER_ 不能定義成BITMAPFILEHEADER;因?yàn)樵贛FC中已存在BITMAPFILEHEADER的定義,在定義成它會顯示重復(fù)定義。同時(shí)自己定義的在View.h和View.cpp中注意引用#include “ImageStruct.h”。2.在后面的引用bmp結(jié)構(gòu)時(shí)我定義成系統(tǒng)自帶的結(jié)構(gòu):BITMAPFILEHEADER bfh;BITMAPINFOHEADER bih;而不是BITMAPFILEHEADER_ ,因?yàn)镸FC中用自帶的定義圖片頭文件信息是正確的,但在位圖信息塊總會在文件最后多出2字節(jié)并默認(rèn)為CD(0x16進(jìn)制)。原因可能是自定義的圖片頭文件少2字節(jié),在后面補(bǔ)充了
5、2字節(jié)。(未知)/*/* BMP位圖文件包括4部分: */* 位圖文件頭結(jié)構(gòu)BITMAPFILEHEADER */* 位圖信息頭結(jié)構(gòu)BITMAPINFOHEADER */* 位圖顏色表RGBQUAD */* 位圖像素?cái)?shù)據(jù) */*/#ifndef _IMAGESTRUCT_#define _IMAGESTRUCT_/*14byte BMP文件頭含有BMP文件的類型、大小、位圖文件的保留字、位圖數(shù)據(jù)距文件頭的偏移量*/typedef struct T_BITMAPFILEHEADER WORD bfType; /2byte 位圖文件的類型,必須為BM 0x424d DWORD bfSize; /4
6、byte 位圖文件的大小,以字節(jié)為單位 WORD bfReserved1; /2byte 位圖文件保留字,必須為0 WORD bfReserved2; /2byte 位圖文件保留字,必須為0 DWORD bfOffBits; /4byte 位圖數(shù)據(jù)距文件頭的偏移量(字節(jié)) BITMAPFILEHEADER_;/*40byte BMP位圖信息頭用于說明位圖的尺寸等信息*/typedef struct T_BITMAPINFOHEADER DWORD biSize; /本結(jié)構(gòu)所占用字節(jié)數(shù)LONG biWidth; /位圖的寬度,以像素為單位LONG biHeight; /位圖的高度,以像素為單位W
7、ORD biPlanes; /目標(biāo)設(shè)備的級別,必須為1WORD biBitCount; /每個(gè)像素所需的位數(shù),必須是1(雙色)、4(16色)、8(256色)或24(真彩色)之一DWORD biCompression; /位圖壓縮類型,必須是 0(不壓縮)1(BI_RLE8壓縮類型)或2(BI_RLE壓縮類型)之一DWORD biSizeImage; /位圖的大小,以字節(jié)為單位LONG biXPelsPerMeter; /位圖水平分辨率,每米像素?cái)?shù)LONG biYPelsPerMeter; /位圖垂直分辨率,每米像素?cái)?shù)DWORD biClrUsed; /位圖實(shí)際使用的顏色表中的顏色數(shù)DWORD
8、biClrImportant; /位圖顯示過程中重要的顏色數(shù) BITMAPINFOHEADER_;/*BMP位圖顏色表*/typedef struct T_RGBQUAD BYTE rgbBlue; /藍(lán)色的亮度(值范圍為0255) BYTE rgbGreen; /綠色的亮度(值范圍為0255) BYTE rgbRed; /紅色的亮度(值范圍為0255) BYTE rgbReserved; /保留,必須為0 RGBQUAD_; #endif第二步:在.View.h中添加共有成員變量和成員函數(shù)1.找到.View.h頭文件添加:#include "ImageStruct.h"2
9、.在Class CBmpDrawView : public Cview中的public中添加成員變量函數(shù):public:/用來保存bmp格式圖片bool SaveBmp(LPCSTR lpFileName); /用來讀取bmp圖片bool ReadBmp(); /用來顯示指定位圖jpg、gif的函數(shù)bool ShowJpgGif(CDC* pDC,CString strPath, int x, int y);/用來顯示指定位圖bmp的函數(shù)void ShowBitmap(CDC* pDC,CString BmpName);/*CBitmap m_bitmaplin; 創(chuàng)建臨時(shí)位圖對象進(jìn)行處理*/
10、CBitmap m_bitmap; /創(chuàng)建位圖對象CString EntName; /保存圖像文件擴(kuò)展名CString BmpName; /保存圖像文件文件名intm_nWidth;/圖像實(shí)際寬度intm_nHeight;/圖像實(shí)際高度intm_nDrawWidth;/圖像顯示寬度intm_nDrawHeight;/圖像顯示高度DWORD m_nImage;/圖像數(shù)據(jù)的字節(jié)數(shù) 只含位圖 DWORD相當(dāng)于long intDWORD m_nSize; /圖像文件大小int m_nLineByte; /圖像一行所占字節(jié)數(shù)intm_nBitCount; /圖像每個(gè)像素所占位數(shù)intm_nPalette
11、; /位圖實(shí)際使用的顏色表中的顏色數(shù)/*注意:信息頭必須條用系統(tǒng)bmp的結(jié)構(gòu)BITMAPFILEHEADER 否則會多2字節(jié)*/BITMAPFILEHEADER bfh; /全局變量文件頭BITMAPINFOHEADER bih; /全局變量信息頭RGBQUAD *m_pPal; /顏色表指針BYTE *m_pImage; /讀入圖片數(shù)據(jù)后的指針 BYTE相當(dāng)于 unsigned charvirtual CBmpDrawView();第三步:添加readbmp函數(shù)添加函數(shù)的方法:a.在View.h的public中直接添加函數(shù)bool ReadBmp()像第二步中一樣;然后在View.cpp中添
12、加函數(shù):bool CBmpDrawView:ReadBmp()。b.選中ClassView區(qū)-選中View類右鍵-增加成員變量函數(shù)函數(shù)類型為bool函數(shù)名為ReadBmp()函數(shù)Access為public。程序會自動在View.cpp中添加函數(shù):bool CBmpDrawView:ReadBmp()。c.添加代碼:/*寫入bmp格式圖片過程*/bool CBmpDrawView:ReadBmp()FILE *fp = fopen(BmpName,"rb"); /讀取bmp圖片 BmpName為圖片的絕對路徑if(fp=0) AfxMessageBox("無法打開文
13、件!",MB_OK,0); return 0; /*讀取文件頭 全局變量bfh BITMAPFILEHEADER 定義在ImageStruct中*/*解決BMP格式倒置的方法 (CSDN) fread(&bfh,sizeof(BITMAPFILEHEADER),1,fp);倒置*/fread(&bfh.bfType,sizeof(WORD),1,fp);fread(&bfh.bfSize,sizeof(DWORD),1,fp);fread(&bfh.bfReserved1,sizeof(WORD),1,fp);fread(&bfh.bfRese
14、rved2,sizeof(WORD),1,fp);fread(&bfh.bfOffBits,sizeof(DWORD),1,fp);m_nSize = bfh.bfSize; /圖像文件的總字節(jié)數(shù)/*判斷是否是bmp格式圖片 'BM'*/if(bfh.bfType!=0x4d42) AfxMessageBox("不是BMP格式圖片!",MB_OK,0); return 0; /*讀取信息頭*/*解決BMP格式倒置的方法fread(&bih,sizeof(BITMAPINFOHEADER),1,fp);倒置*/fread(&bih.bi
15、Size,sizeof(DWORD),1,fp);fread(&bih.biWidth,sizeof(LONG),1,fp);fread(&bih.biHeight,sizeof(LONG),1,fp);fread(&bih.biPlanes,sizeof(WORD),1,fp);fread(&bih.biBitCount,sizeof(WORD),1,fp);fread(&bih.biCompression,sizeof(DWORD),1,fp);fread(&bih.biSizeImage,sizeof(DWORD),1,fp);fread(
16、&bih.biXPelsPerMeter,sizeof(LONG),1,fp);fread(&bih.biYPelsPerMeter,sizeof(LONG),1,fp);fread(&bih.biClrUsed,sizeof(DWORD),1,fp);fread(&bih.biClrImportant,sizeof(DWORD),1,fp);if(bih.biSize!=sizeof(bih) AfxMessageBox("本結(jié)構(gòu)所占用字節(jié)數(shù)出現(xiàn)錯(cuò)誤"); return 0; /*位圖壓縮類型:必須是0(不壓縮)、1(BI_RLE8壓縮類型
17、)、2(BI_RLE壓縮類型)之一*/if(bih.biCompression = BI_RLE8 | bih.biCompression = BI_RLE4) AfxMessageBox("位圖被壓縮!"); return 0; /*獲取圖像高寬和每個(gè)像素所占位數(shù)*/m_nHeight = bih.biHeight;m_nWidth = bih.biWidth;m_nDrawHeight = bih.biHeight;m_nDrawWidth = bih.biWidth;m_nBitCount = bih.biBitCount; /每個(gè)像素所占位數(shù)/*計(jì)算圖像每行像素所占
18、的字節(jié)數(shù)(必須是4字節(jié)的倍數(shù)) 2種方法*/m_nLineByte = (m_nWidth*m_nBitCount/8+3)/4*4;m_nLineByte = (m_nWidth*m_nBitCount+31)/32*4;/*計(jì)算圖片位圖的大小 長*寬*3為24位bmp位圖大小3表示rgb*/m_nImage = m_nLineByte * m_nHeight;/*位圖實(shí)際使用的顏色表中的顏色數(shù) biClrUsed 注:24位bmp不用改參數(shù)*/m_nPalette = 0; if(bih.biClrUsed) m_nPalette = bih.biClrUsed;/*申請位圖空間 大小為位
19、圖大小 m_nImage*/*注意:malloc只能申請4字節(jié)的空間(未知) 但fread(,m_nImage,)讀入位圖大小個(gè)*/m_pImage=(BYTE*)malloc(m_nImage);fread(m_pImage,m_nImage,1,fp);/*注意:要關(guān)閉fp*/fclose(fp);return true;第四步:添加保存menu控件和函數(shù)a.查看-建立類導(dǎo)向(Ctrl+W)-CpictureXSView(類名)-ID_FILE_SAVE(IDs列表)-COMMAND(Messages列表)-默認(rèn)成員函數(shù)名為OnFileSave-Member Functions(成員函數(shù))
20、中雙擊該函數(shù)進(jìn)入函數(shù)編輯。b.注意:Ctrl+W把另存為也設(shè)置成與保存相同的函數(shù)。ID_FILE_SAVE_AS-COMMAN-函數(shù)OnFileSaveAs改名為OnFileSave。c.添加代碼:/*文件保存*/void CBmpDrawView:OnFileSave() / TODO: Add your command handler code hereCString filter;filter="所有文件(*.*)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TI
21、FF(*.tiff)|*.tiff|"/*重點(diǎn):1-文件打開 0-文件保存*/CFileDialog dlg(0,NULL,NULL,OFN_HIDEREADONLY,filter,NULL); /產(chǎn)生保存對話框/*按下確定按鈕*/if( dlg.DoModal() = IDOK )CString str;CString strName;CString filename;str = dlg.GetPathName(); /獲取文件的路徑filename = dlg.GetFileTitle(); /獲取文件名 int nFilterIndex=dlg.m_ofn.nFilterInd
22、ex;if( nFilterIndex = 2 ) /當(dāng)用戶選擇文件過濾器為".BMP"時(shí)str = str + ".bmp" /自動加擴(kuò)展名.bmpSaveBmp(str); /保存bmp圖片 就是一個(gè)寫出圖片的過程 AfxMessageBox("圖片保存成功",MB_OK,0);第五步:添加保存函數(shù)SaveBmp添加函數(shù)原理同第三步添加Readbmp函數(shù),在添加下列代碼:/*保存bmp格式圖片 寫出圖片的過程 只處理24像素的圖片 該圖片無調(diào)色板*/bool CBmpDrawView:SaveBmp(LPCTSTR lpFileN
23、ame)/*lpFileName為位圖文件路徑名*/AfxMessageBox(lpFileName);FILE *fpo = fopen(BmpName,"rb");FILE *fpw = fopen(lpFileName,"wb");fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);/*malloc只能申請4字節(jié)的空間 (未知)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全員A練習(xí)題
- 眼科三基習(xí)題庫(附答案)
- 數(shù)字化醫(yī)療健康數(shù)據(jù)共享協(xié)議
- 貴州國企招聘2025納雍縣鴿子花農(nóng)業(yè)有限公司招聘10人筆試參考題庫附帶答案詳解
- 2025河南中原特鋼技術(shù)(管理)人才招聘33名筆試參考題庫附帶答案詳解
- 2025年隨州國投集團(tuán)公開招聘42名工作人員筆試參考題庫附帶答案詳解
- 2025年中國檢驗(yàn)認(rèn)證集團(tuán)河南公司招聘30人筆試參考題庫附帶答案詳解
- 2025內(nèi)蒙古中材科技(錫林郭勒)風(fēng)電葉片有限公司招聘32人筆試參考題庫附帶答案詳解
- 2025中儲糧(海南)有限公司招聘19人筆試參考題庫附帶答案詳解
- 初中數(shù)學(xué)跨學(xué)科教學(xué)的創(chuàng)新實(shí)踐與路徑探索
- 商務(wù)會議花卉布置合同
- 構(gòu)美-空間形態(tài)設(shè)計(jì)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 數(shù)易姓名學(xué)完整版本
- 校園小品《我的未來不是夢》劇本
- 智慧火電廠綜合安防解決方案
- 《歷史研究》格式-20210720155944
- 《鋼鐵是怎樣煉成的》讀書分享 課件
- 中班語言《什么東西彎又彎》課件
- 2024年民政局離婚協(xié)議書樣板
- XX醫(yī)院抗菌藥物臨床應(yīng)用監(jiān)督管理機(jī)制+預(yù)警機(jī)制
- 臨湘事業(yè)單位統(tǒng)一招聘考試真題
評論
0/150
提交評論