生活随笔
收集整理的這篇文章主要介紹了
读取bmp格式数据--实践思考
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
實踐代碼
#pragma once
#include <afx.h>
class DigitalImage
{
private://指針數(shù)據(jù)類型,需要動態(tài)分配數(shù)據(jù)大小,并初始化數(shù)據(jù)//文件頭LPBITMAPFILEHEADER m_lpBitmapFileHender;//除位圖文件頭的所有數(shù)據(jù)LPBYTE m_lpNotFileHenderData;//文件信息頭LPBITMAPINFOHEADER m_lpBitmapInfoHender;LPBITMAPINFO m_lpBitmapInfo;//顏色表LPRGBQUAD m_lpRgbQuad;RGBQUAD* RgbArray;//圖像數(shù)據(jù)LPBYTE m_lpBmpData;public:DigitalImage(LPCTSTR FileName);~DigitalImage();};
#include "DigitalImage.h"
#include<iostream>
#include<math.h>
using namespace std;//構(gòu)造函數(shù),通過bmp(8位一下位圖,即256色一下)位圖的路勁來加載位圖數(shù)據(jù)
DigitalImage::DigitalImage(LPCTSTR FileName)
{CFile RdBmp;//打開位圖if (!RdBmp.Open(FileName, CFile::modeRead || CFile::shareDenyWrite))cout << "圖像文件無法打開!" << endl;//申請文件頭內(nèi)存空間,用BYTE數(shù)組存儲m_lpBitmapFileHender = (LPBITMAPFILEHEADER) new BYTE[sizeof(BITMAPFILEHEADER)];//初始化文件頭memset(m_lpBitmapFileHender, 0, sizeof(BITMAPFILEHEADER));//讀取文件頭int FileHenderSize=RdBmp.Read((void*)m_lpBitmapFileHender, sizeof(BITMAPFILEHEADER));//判斷是否讀取了文件頭if(FileHenderSize!= sizeof(BITMAPFILEHEADER))cout << "圖像文件頭讀取錯誤!" << endl;//判斷是否是位圖圖像if (m_lpBitmapFileHender->bfType == 0x4d42)//0x4d42=="BM",與是否是高字節(jié)在前還是低字節(jié)在前有關(guān){//通過文件頭獲取圖像文件大小DWORD FileSize = m_lpBitmapFileHender->bfSize;cout << "圖像文件總字節(jié)數(shù):" << FileSize << endl;//獲取位圖文件相對于文件頭的偏移量DWORD of = m_lpBitmapFileHender->bfOffBits;//計算除文件頭外,圖像文件信息、包括文件信息頭,顏色表和位圖像素數(shù)據(jù)的總大小DWORD NotFileHenderSize = RdBmp.GetLength() - sizeof(BITMAPFILEHEADER);//GetLength()獲取文件按字節(jié)計算的長度,而不是數(shù)量;//分配內(nèi)存,讀取數(shù)據(jù),用于解析出來文件信息頭,顏色表和像素數(shù)據(jù)m_lpNotFileHenderData = new BYTE[NotFileHenderSize];//初始化數(shù)組memset(m_lpNotFileHenderData, 0, NotFileHenderSize);//讀取除文件頭外的數(shù)據(jù)信息RdBmp.Read(m_lpNotFileHenderData, NotFileHenderSize);//關(guān)閉文件流RdBmp.Close();//通過m_lpNotFileHenderData數(shù)組獲取文件信息頭和文件信息結(jié)構(gòu)體的起始地址。m_lpBitmapInfoHender =(LPBITMAPINFOHEADER) m_lpNotFileHenderData;m_lpBitmapInfo = (LPBITMAPINFO)m_lpNotFileHenderData; //計算顏色表的起始位置m_lpRgbQuad = (LPRGBQUAD)(m_lpNotFileHenderData + m_lpBitmapInfoHender->biSize);//通過文件信息頭判斷位圖中是使用的顏色數(shù)if (m_lpBitmapInfoHender->biClrUsed == 0)cout << "圖像沒有顏色表" << endl;else{//通過判斷位圖是幾位位圖,計算顏色數(shù),int size = (int)pow(2, m_lpBitmapInfoHender->biBitCount);//分配顏色表數(shù)組RgbArray = new RGBQUAD[size];//通過顏色表的起始位置獲取顏色數(shù)據(jù)存入顏色表數(shù)組for (int i = 0; i < size; i++){RgbArray[i].rgbRed = m_lpRgbQuad->rgbRed;RgbArray[i].rgbGreen = m_lpRgbQuad->rgbGreen;RgbArray[i].rgbBlue = m_lpRgbQuad->rgbBlue;RgbArray[i].rgbReserved = 0;m_lpRgbQuad++;}//計算顏色表的字節(jié)長度DWORD RgbLen = size * sizeof(RGBQUAD);//顏色表之后即為圖像像素的起始地址;m_lpBmpData = m_lpNotFileHenderData + m_lpBitmapInfoHender->biSize + sizeof(RgbArray);}}else{cout << "圖像文件非BMP格式 !" << endl;}
}DigitalImage::~DigitalImage()
{delete[] m_lpBitmapFileHender;delete[] m_lpNotFileHenderData;m_lpBitmapInfoHender=NULL;m_lpBitmapInfo=NULL;m_lpRgbQuad=NULL;delete[] RgbArray;m_lpBmpData = NULL;
}
#include "DigitalImage.h"
int main()
{//注意此處請更換問圖片存儲路徑LPCTSTR filepath = "海王星.bmp";DigitalImage img(filepath);system("pause");return 0;
}
?
總結(jié)
以上是生活随笔為你收集整理的读取bmp格式数据--实践思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。