?? dibshow.cpp
字號:
/*
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
BOOL LoadBmpFile (HWND hWnd,char *BmpFileName)
{
//文件句柄
HFILE hf;
//指向BITMAPINFOHEADER結構的指針
LPBITMAPINFOHEADER lpImgData;
//指向邏輯調色板結構的指針
LOGPALETTE *pPal;
//指向RGBQUAD結構的指針
LPRGBQUAD lpRGB;
//用來保存設備中原來的調色板
HPALETTE hPrevPalette;
//設備句柄
HDC hDc;
//存儲調色板的局部內存句柄
HLOCAL hPal;
//每一行的字節數
DWORD LineBytes;
//實際的圖象數據占用的字節數
DWORD ImgSize;
//實際用到的顏色數 ,即調色板數組中的顏色個數
DWORD NumColors;
DWORD i;
if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){
MessageBox(hWnd,"File c:\\test.bmp not found!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE; //打開文件錯誤,返回
}
//將BITMAPFILEHEADER結構從文件中讀出,填寫到bf中
_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
//將BITMAPINFOHEADER結構從文件中讀出,填寫到bi中
_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER));
//我們定義了一個宏 #define WIDTHBYTES(i) ((i+31)/32*4)
//上面曾經提到過,每一行的字節數必須是4的整倍數,
//只要調用WIDTHBYTES(bi.biWidth*bi.biBitCount)就能完成這一換算
//舉一個例子,對于2色圖,如果圖象寬是31,則每一行需要31位存儲,合3個字節加
//7位,因為字節數必須是4的整倍數,所以應該是4,而此時的//biWidth=31,biBitCount=1,WIDTHBYTES(31*1)=4,和我們設想的一樣。
//再舉一個256色的例子,如果圖象寬是31,則每一行需要31個字節存儲,因為字節數
//必須是4的整倍數,所以應該是32,而此時//biWidth=31,biBitCount=8,WIDTHBYTES(31*8)=32,和我們設想的一樣。你可以多舉
//幾個例子來驗證一下
//LineBytes為每一行的字節數
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);
//ImgSize為實際的圖象數據占用的字節數
ImgSize=(DWORD)LineBytes*bi.biHeight;
//NumColors為實際用到的顏色數 ,即調色板數組中的顏色個數
if(bi.biClrUsed!=0)
NumColors=(DWORD)bi.biClrUsed; //如果bi.biClrUsed不為零,就是本圖象實際
//用到的顏色數
else //否則,用到的顏色數為2的biBitCount次方。
switch(bi.biBitCount){
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0; //對于真彩色圖,沒用到調色板
break;
default:
//不處理其它的顏色數,認為出錯。
MessageBox(hWnd,"Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE; //關閉文件,返回FALSE
}
if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)))
{
//計算出的偏移量與實際偏移量不符,一定是顏色數出錯
MessageBox(hWnd,"Invalid color numbers!","Error Message" ,MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE; //關閉文件,返回FALSE
}
bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
//分配內存,大小為BITMAPINFOHEADER結構長度加調色板+實際位圖數據
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
//分配內存錯誤
MessageBox(hWnd,"Error alloc memory!","ErrorMessage",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE; //關閉文件,返回FALSE
}
//指針lpImgData指向該內存區
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
//文件指針重新定位到BITMAPINFOHEADER開始處
_llseek(hf,sizeof(BITMAPFILEHEADER),SEEK_SET);
//將文件內容讀入lpImgData
_hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER)
+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
_lclose(hf); //關閉文件
if(NumColors!=0) //NumColors不為零,說明用到了調色板
{
//為邏輯調色板分配局部內存,大小為邏輯調色板結構長度加NumColors個PALETTENTRY大小
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY));
//指針pPal指向該內存區
pPal =(LOGPALETTE *)LocalLock(hPal);
//填寫邏輯調色板結構的頭
pPal->palNumEntries = NumColors;
pPal->palVersion = 0x300;
//lpRGB指向的是調色板開始的位置
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER));
//填寫每一項
for (i = 0; i < NumColors; i++)
{
pPal->palPalEntry[i].peRed=lpRGB->rgbRed;
pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen;
pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue;
pPal->palPalEntry[i].peFlags=(BYTE)0;
lpRGB++; //指針移到下一項
}
//產生邏輯調色板,hPalette是一個全局變量
hPalette=CreatePalette(pPal);
//釋放局部內存
LocalUnlock(hPal);
LocalFree(hPal);
}
//獲得設備上下文句柄
hDc=GetDC(hWnd);
if(hPalette) //如果剛才產生了邏輯調色板
{
//將新的邏輯調色板選入DC,將舊的邏輯調色板句柄保存在hPrevPalette
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
}
//產生位圖句柄
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData, DIB_RGB_COLORS);
//將原來的調色板(如果有的話)選入設備上下文句柄
if(hPalette && hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
}
ReleaseDC(hWnd,hDc); //釋放設備上下文
GlobalUnlock(hImgData); //解鎖內存區
return TRUE; //成功返回
}
*/
/* BOOL DIBShow(CFile* pFile)
{
BITMAPFILEHEADER bmfHeader;
LPBITMAPINFOHEADER lpBMIH;
int nCount, nSize;
try
{
nCount = pFile->Read((LPVOID) &bmfHeader, sizeof(BITMAPFILEHEADER));
if(nCount != sizeof(BITMAPFILEHEADER)) {
throw new CException;
}
if(bmfHeader.bfType != 0x4d42) {
throw new CException;
}
nSize = bmfHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
lpBMIH = (LPBITMAPINFOHEADER) new char[nSize];
//nBmihAlloc = m_nImageAlloc = crtAlloc;
nCount = pFile->Read(m_lpBMIH, nSize); // info hdr & color table
//ComputeMetrics();
if(lpBMIH->biSize != sizeof(BITMAPINFOHEADER)) {
TRACE("Not a valid Windows bitmap -- probably an OS/2 bitmap\n");
throw new CException;
}
DWORD dwSizeImage = lpBMIH->biSizeImage;
if(dwSizeImage == 0) {
DWORD dwBytes = ((DWORD) lpBMIH->biWidth * lpBMIH->biBitCount) / 32;
if(((DWORD) lpBMIH->biWidth * lpBMIH->biBitCount) % 32) {
dwBytes++;
}
dwBytes *= 4;
dwSizeImage = dwBytes * lpBMIH->biHeight; // no compression
}
LPVOID lpvColorTable = (LPBYTE) lpBMIH + sizeof(BITMAPINFOHEADER);
//ComputePaletteSize(m_lpBMIH->biBitCount);
if((lpBMIH == NULL) || (lpBMIH->biClrUsed == 0)) {
switch(lpBMIH->biBitCount) {
case 1:
m_nColorTableEntries = 2;
break;
case 4:
m_nColorTableEntries = 16;
break;
case 8:
m_nColorTableEntries = 256;
break;
case 16:
case 24:
case 32:
m_nColorTableEntries = 0;
break;
default:
ASSERT(FALSE);
}
}
else {
m_nColorTableEntries = m_lpBMIH->biClrUsed;
}
ASSERT((m_nColorTableEntries >= 0) && (m_nColorTableEntries <= 256));
MakePalette();
m_lpImage = (LPBYTE) new char[m_dwSizeImage];
nCount = pFile->Read(m_lpImage, m_dwSizeImage); // image only
}
catch(CException* pe)
{
AfxMessageBox("Read error");
pe->Delete();
return FALSE;
}
return TRUE;
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -