日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql显示bmp图片_BMP格式图像的显示

發(fā)布時(shí)間:2025/4/16 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql显示bmp图片_BMP格式图像的显示 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用多文檔編程 也可以使用單文檔編程

建立一個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。