mysql显示bmp图片_BMP格式图像的显示
使用多文檔編程 也可以使用單文檔編程
建立一個(gè)DIB圖像的顯示類(lèi) ImageDib
成員變量:
4個(gè)指針:
LPBYTE m_lpDib;??????//指向DIB的指針
LPBITMAPINFOHEADER m_lpBmpInfoHead; ?//圖像信息頭指針
LPRGBQUAD m_lpColorTable; ????//圖像顏色表指針
unsigned char * m_pImgData; ????//圖像數(shù)據(jù)指針
4個(gè)普通變量(存放圖像的參數(shù)):
int m_imgWidth;???????//圖像的寬,像素為單位
int m_imgHeight; ??????//圖像的高,像素為單位
int m_nBitCount;??????//每像素占的位數(shù)
int m_nColorTableLength; ?????//顏色表長(zhǎng)度(多少個(gè)表項(xiàng))
1個(gè)句柄:
HPALETTE m_hPalette;?????//邏輯調(diào)色板句柄
成員函數(shù):
帶參數(shù)構(gòu)造函數(shù) ImageDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,?unsigned char *pImgData);?????????? //帶參數(shù)的構(gòu)造函數(shù)
View Code
ImageDib::ImageDib(CSize size, intnBitCount, LPRGBQUAD lpColorTable,
unsignedchar *pImgData)
{//如果沒(méi)有位圖數(shù)據(jù)傳入,我們認(rèn)為是空的DIB,此時(shí)不分配DIB內(nèi)存
if(pImgData==NULL){
m_lpDib=NULL;
m_lpColorTable=NULL;
m_pImgData=NULL; //圖像數(shù)據(jù)
m_lpBmpInfoHead=NULL; //圖像信息頭
m_hPalette =NULL;
}else{//如果有位圖數(shù)據(jù)傳入//可以通過(guò)調(diào)用ReplaceDib()來(lái)實(shí)現(xiàn) 代碼一樣的//ReplaceDib(size,nBitCount,lpColorTable,pImgData);//圖像的寬、高、每像素位數(shù)等成員變量賦值
m_imgWidth=size.cx;
m_imgHeight=size.cy;
m_nBitCount=nBitCount;//根據(jù)每像素位數(shù),計(jì)算顏色表長(zhǎng)度
m_nColorTableLength=ComputeColorTabalLength(nBitCount);//每行像素所占字節(jié)數(shù),必須擴(kuò)展成4的倍數(shù)
int lineByte=(m_imgWidth*nBitCount/8+3)/4*4;//位圖數(shù)據(jù)緩沖區(qū)的大小(圖像大小)
int imgBufSize=m_imgHeight*lineByte;//為m_lpDib一次性分配內(nèi)存,生成DIB結(jié)構(gòu)
m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength+imgBufSize];//填寫(xiě)B(tài)ITMAPINFOHEADER結(jié)構(gòu)
m_lpBmpInfoHead =(LPBITMAPINFOHEADER) m_lpDib;
m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER);
m_lpBmpInfoHead->biWidth =m_imgWidth;
m_lpBmpInfoHead->biHeight =m_imgHeight;
m_lpBmpInfoHead->biPlanes = 1;
m_lpBmpInfoHead->biBitCount =m_nBitCount;
m_lpBmpInfoHead->biCompression =BI_RGB;
m_lpBmpInfoHead->biSizeImage = 0;
m_lpBmpInfoHead->biXPelsPerMeter = 0;
m_lpBmpInfoHead->biYPelsPerMeter = 0;
m_lpBmpInfoHead->biClrUsed =m_nColorTableLength;
m_lpBmpInfoHead->biClrImportant =m_nColorTableLength;//調(diào)色板句柄初始化為空,有顏色表時(shí),MakePalette()函數(shù)要生成新的調(diào)色板
m_hPalette =NULL;//如果有顏色表,則將顏色表拷貝進(jìn)DIB的顏色表位置
if(m_nColorTableLength!=0){//m_lpColorTable指向DIB顏色表的起始位置
m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER));//顏色表拷貝
memcpy(m_lpColorTable,lpColorTable,sizeof(RGBQUAD) *m_nColorTableLength);//創(chuàng)建邏輯調(diào)色板
MakePalette();
}//m_pImgData指向DIB位圖數(shù)據(jù)起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD) *m_nColorTableLength;//拷貝圖像數(shù)據(jù)進(jìn)DIB位圖數(shù)據(jù)區(qū)
memcpy(m_pImgData,pImgData,imgBufSize);
}
}
讀文件: ? BOOL Read(LPCTSTR lpszPathName); ??//DIB讀函數(shù)
View Code
BOOL ImageDib::Read(LPCTSTR lpszPathName)
{//讀模式打開(kāi)圖像文件
CFile file;if (!file.Open(lpszPathName, CFile::modeRead |CFile::shareDenyWrite))returnFALSE;
BITMAPFILEHEADER bmfh;//讀取BITMAPFILEHEADER結(jié)構(gòu)到變量bmfh中
int nCount=file.Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));//為m_lpDib分配空間,讀取DIB進(jìn)內(nèi)存
if(m_lpDib!=NULL) delete []m_lpDib;
m_lpDib=new BYTE[file.GetLength() -sizeof(BITMAPFILEHEADER)];
file.Read(m_lpDib, file.GetLength()-sizeof(BITMAPFILEHEADER));//m_lpBmpInfoHead位置為m_lpDib起始位置
m_lpBmpInfoHead =(LPBITMAPINFOHEADER)m_lpDib;//為成員變量賦值
m_imgWidth=m_lpBmpInfoHead->biWidth;
m_imgHeight=m_lpBmpInfoHead->biHeight;
m_nBitCount=m_lpBmpInfoHead->biBitCount;//計(jì)算顏色表長(zhǎng)度
m_nColorTableLength= ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount);//如果有顏色表,則創(chuàng)建邏輯調(diào)色板
m_hPalette =NULL;if(m_nColorTableLength!=0){m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER));
MakePalette();
}//m_pImgData指向DIB的位圖數(shù)據(jù)起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) *m_nColorTableLength;returnTRUE;
}
寫(xiě)文件: BOOL Write(LPCTSTR lpszPathName);?????? //DIB寫(xiě)函數(shù)
View Code
BOOL ImageDib::Write(LPCTSTR lpszPathName)
{//寫(xiě)模式打開(kāi)文件
CFile file;if (!file.Open(lpszPathName, CFile::modeCreate |CFile::modeReadWrite|CFile::shareExclusive))returnFALSE;//填寫(xiě)文件頭結(jié)構(gòu)
BITMAPFILEHEADER bmfh;
bmfh.bfType= 0x4d42; //'BM'
bmfh.bfSize = 0;
bmfh.bfReserved1= bmfh.bfReserved2 = 0;
bmfh.bfOffBits= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) *m_nColorTableLength;try{//文件頭結(jié)構(gòu)寫(xiě)進(jìn)文件
file.Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));//文件信息頭結(jié)構(gòu)寫(xiě)進(jìn)文件
file.Write(m_lpBmpInfoHead, sizeof(BITMAPINFOHEADER));//如果有顏色表的話(huà),顏色表寫(xiě)進(jìn)文件
if(m_nColorTableLength!=0)
file.Write(m_lpColorTable,sizeof(RGBQUAD) *m_nColorTableLength);//位圖數(shù)據(jù)寫(xiě)進(jìn)文件
int imgBufSize=(m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight;
file.Write(m_pImgData, imgBufSize);
}catch(CException*pe) {
pe->Delete();
AfxMessageBox("write error");returnFALSE;
}//函數(shù)返回
returnTRUE;
}
計(jì)算顏色表長(zhǎng)度:? int ComputeColorTabalLength(int nBitCount);?//計(jì)算顏色表的長(zhǎng)度
View Code
int ImageDib::ComputeColorTabalLength(intnBitCount)
{intcolorTableLength;switch(nBitCount) {case 1:
colorTableLength= 2;break;case 4:
colorTableLength= 16;break;case 8:
colorTableLength= 256;break;case 16:case 24:case 32:
colorTableLength= 0;break;default:
ASSERT(FALSE);
}
ASSERT((colorTableLength>= 0) && (colorTableLength <= 256));returncolorTableLength;
}
創(chuàng)建邏輯調(diào)色板:? void MakePalette();??????//創(chuàng)建邏輯調(diào)色板
View Code
voidImageDib::MakePalette()
{//如果顏色表長(zhǎng)度為0,則不創(chuàng)建邏輯調(diào)色板
if(m_nColorTableLength == 0)return;//刪除舊的邏輯調(diào)色板句柄
if(m_hPalette !=NULL) ::DeleteObject(m_hPalette);//申請(qǐng)空間,根據(jù)顏色表生成LOGPALETTE結(jié)構(gòu)
LPLOGPALETTE pLogPal = (LPLOGPALETTE) new char[2 * sizeof(WORD) +m_nColorTableLength* sizeof(PALETTEENTRY)];
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries =m_nColorTableLength;
LPRGBQUAD m_lpDibQuad=(LPRGBQUAD) m_lpColorTable;for(int i = 0; i < m_nColorTableLength; i++) {
pLogPal->palPalEntry[i].peRed = m_lpDibQuad->rgbRed;
pLogPal->palPalEntry[i].peGreen = m_lpDibQuad->rgbGreen;
pLogPal->palPalEntry[i].peBlue = m_lpDibQuad->rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
m_lpDibQuad++;
}//創(chuàng)建邏輯調(diào)色板
m_hPalette =::CreatePalette(pLogPal);//釋放空間
delete pLogPal;
}
讀取圖像維數(shù): CSize GetDimensions();?????//讀取圖像維數(shù)
View Code
CSize ImageDib::GetDimensions()
{if(m_lpDib == NULL) return CSize(0, 0);returnCSize(m_imgWidth, m_imgHeight);
}
圖像繪制: ??? BOOL Draw(CDC* pDC, CPoint origin, CSize size); //圖像繪制
View Code
BOOL ImageDib::Draw(CDC*pDC, CPoint origin, CSize size)
{
HPALETTE hOldPal=NULL; //舊的調(diào)色板句柄
if(m_lpDib == NULL) return FALSE; //如果DIB為空,則返回0
if(m_hPalette != NULL) { //如果DIB有調(diào)色板//將調(diào)色板選進(jìn)設(shè)備環(huán)境中
hOldPal=::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);
pDC->RealizePalette();
}
pDC->SetStretchBltMode(COLORONCOLOR); //設(shè)置位圖伸縮模式//將DIB在pDC所指向的設(shè)備上進(jìn)行顯示
::StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy,0, 0, m_lpBmpInfoHead->biWidth, m_lpBmpInfoHead->biHeight,m_pImgData,
(LPBITMAPINFO) m_lpBmpInfoHead, DIB_RGB_COLORS, SRCCOPY);if(hOldPal!=NULL) //恢復(fù)舊的調(diào)色板
::SelectPalette(pDC->GetSafeHdc(), hOldPal, TRUE);returnTRUE;
}
用新的數(shù)據(jù)替代DIB:void ReplaceDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,?unsigned char *pImgData);????????????? ?//用新的數(shù)據(jù)替換DIB
View Code
void ImageDib::ReplaceDib(CSize size, intnBitCount,
LPRGBQUAD lpColorTable,unsignedchar *pImgData)
{//釋放原DIB所占空間
Empty();//成員變量賦值
m_imgWidth=size.cx;
m_imgHeight=size.cy;
m_nBitCount=nBitCount;//計(jì)算顏色表的長(zhǎng)度
m_nColorTableLength=ComputeColorTabalLength(nBitCount);//每行像素所占字節(jié)數(shù),擴(kuò)展成4的倍數(shù)
int lineByte=(m_imgWidth*nBitCount/8+3)/4*4;//位圖數(shù)據(jù)的大小
int imgBufSize=m_imgHeight*lineByte;//為m_lpDib重新分配空間,以存放新的DIB
m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength+imgBufSize];//填寫(xiě)位圖信息頭BITMAPINFOHEADER結(jié)構(gòu)
m_lpBmpInfoHead =(LPBITMAPINFOHEADER) m_lpDib;
m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER);
m_lpBmpInfoHead->biWidth =m_imgWidth;
m_lpBmpInfoHead->biHeight =m_imgHeight;
m_lpBmpInfoHead->biPlanes = 1;
m_lpBmpInfoHead->biBitCount =m_nBitCount;
m_lpBmpInfoHead->biCompression =BI_RGB;
m_lpBmpInfoHead->biSizeImage = 0;
m_lpBmpInfoHead->biXPelsPerMeter = 0;
m_lpBmpInfoHead->biYPelsPerMeter = 0;
m_lpBmpInfoHead->biClrUsed =m_nColorTableLength;
m_lpBmpInfoHead->biClrImportant =m_nColorTableLength;//調(diào)色板置空
m_hPalette =NULL;//如果有顏色表,則將顏色表拷貝至新生成的DIB,并創(chuàng)建邏輯調(diào)色板
if(m_nColorTableLength!=0){
m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER));
memcpy(m_lpColorTable,lpColorTable,sizeof(RGBQUAD) *m_nColorTableLength);
MakePalette();
}//m_pImgData指向DIB的位圖數(shù)據(jù)起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD) *m_nColorTableLength;//將新位圖數(shù)據(jù)拷貝至新的DIB中
memcpy(m_pImgData,pImgData,imgBufSize);
}
清理空間函數(shù): void Empty();???????????????????????? ?//清理空間
View Code
voidImageDib::Empty()
{//釋放DIB內(nèi)存緩沖區(qū)
if(m_lpDib !=NULL) {
delete [] m_lpDib;
m_lpDib=NULL;
m_lpColorTable=NULL;
m_pImgData=NULL;
m_lpBmpInfoHead=NULL;
}//釋放邏輯調(diào)色板緩沖區(qū)
if(m_hPalette !=NULL){
::DeleteObject(m_hPalette);
m_hPalette=NULL;
}
}
默認(rèn)構(gòu)造函數(shù):
View Code
ImageDib::ImageDib()
{
m_lpDib=NULL;//初始化m_lpDib為空。
m_lpColorTable=NULL; //顏色表指針為空
m_pImgData=NULL; //圖像數(shù)據(jù)指針為空
m_lpBmpInfoHead=NULL; //圖像信息頭指針為空
m_hPalette = NULL; //調(diào)色板為空
}
默認(rèn)析構(gòu)函數(shù):
View Code
ImageDib::~ImageDib()
{//釋放m_lpDib所指向的內(nèi)存緩沖區(qū)
if(m_lpDib !=NULL)
delete [] m_lpDib;//如果有調(diào)色板,釋放調(diào)色板緩沖區(qū)
if(m_hPalette !=NULL)
::DeleteObject(m_hPalette);
}
編寫(xiě)好ImageDib類(lèi)后,在doc文件類(lèi)中添加一個(gè)ImageDib類(lèi)的指針,在構(gòu)造函數(shù)中new出來(lái),在析構(gòu)函數(shù)中delete,然后重寫(xiě)OnOpenDocument()函數(shù) 在其中調(diào)用讀函數(shù)打開(kāi)圖像 在View類(lèi)的OnDraw()中調(diào)用ImageDib類(lèi)的繪制函數(shù) 將圖像繪制在打開(kāi)的新文件中
總結(jié):編程的關(guān)鍵在于幾個(gè)指針的賦值,指向DIB的指針的分配空間,位圖信息頭等結(jié)構(gòu)的賦值等等。
只要記住:
BMP文件=位圖頭文件+位圖信息頭+顏色表+數(shù)據(jù)塊 (等號(hào)后邊的內(nèi)容按順序?qū)懙?
DIB=位圖信息頭+顏色表+數(shù)據(jù)塊
位圖信息=位圖信息頭+顏色表
這些圖像文件的存儲(chǔ)組成及順序,萬(wàn)事OK!
總結(jié)
以上是生活随笔為你收集整理的mysql显示bmp图片_BMP格式图像的显示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 表名不加单引号_当表名“ m
- 下一篇: 二层交换机可以划分vlan吗_二层交换机