19,468
社区成员
发帖
与我相关
我的任务
分享
BITMAPINFO * LoadBMPFile(const TCHAR * pFileName)
{
if ( pFileName==NULL )
return NULL;
HANDLE handle = CreateFile(pFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( handle == INVALID_HANDLE_VALUE )
return NULL;
BITMAPFILEHEADER bmFH;
DWORD dwRead = 0;
ReadFile(handle, & bmFH, sizeof(bmFH), & dwRead, NULL);
BITMAPINFO * pDIB = NULL;
if ( (bmFH.bfType == 0x4D42) && (bmFH.bfSize<=GetFileSize(handle, NULL)) )
{
pDIB = (BITMAPINFO *) new BYTE[bmFH.bfSize];
if ( pDIB )
ReadFile(handle, pDIB, bmFH.bfSize, & dwRead, NULL);
}
CloseHandle(handle);
return pDIB;
}
//
#define WIDTHBYTES(i) ((i+31)/32*4)
//
BITMAPFILEHEADER g_bf;
BITMAPV5HEADER g_bi;
DWORD LineBytes;
DWORD NumColors;
DWORD ImgWidth=0 , ImgHeight=0;
HGLOBAL hImgData=NULL;
HPALETTE hPalette=NULL;
HBITMAP hBitmap=NULL;
char g_BmpFileName[260]="";
//
BOOL LoadBmpFile (char *BmpFileName)
{
HFILE hf;
LPBITMAPV5HEADER lpImgData;// LCS_sRGB='sRGB' BITMAPV4HEADER
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HDC hDc;
HLOCAL hPal;
DWORD ImgSize;
DWORD i,all;
// DWORD mask3[3];// [0]=0xFF00 0000; [1]=0x00FF 0000 ;[2]=0x0000 FF00
all= sizeof(BITMAPINFOHEADER); // 0x28
all= sizeof(BITMAPV4HEADER); // 0x6C
all= sizeof(BITMAPV5HEADER); // 0x7C
if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR)
{
MessageBox(0,BmpFileName,"Error Not Found",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
strcpy(g_BmpFileName,BmpFileName);
//
_lread(hf,(LPSTR)&g_bf,sizeof(BITMAPFILEHEADER));
_lread(hf,(LPSTR)&g_bi,sizeof(BITMAPV5HEADER));
ImgWidth=g_bi.bV5Width; //900
ImgHeight=g_bi.bV5Height;//1257
// if(bi.biCompression == BI_BITFIELDS)//3
// {//DWORD RedMask; DWORD GreenMask; DWORD BlueMask;
// _lread(hf,mask3,sizeof(mask3));
// }
LineBytes=(DWORD)WIDTHBYTES(g_bi.bV5Width*g_bi.bV5BitCount);
ImgSize=(DWORD)LineBytes*g_bi.bV5Height;
if(g_bi.bV5ClrUsed!=0)
NumColors=(DWORD)g_bi.bV5ClrUsed;
else
{
switch(g_bi.bV5BitCount)
{
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0;
break;
case 32:
NumColors=0;
break;
default:
MessageBox(0,"Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
}
if(g_bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPV5HEADER)))
{
MessageBox(0,"Invalid color numbers!","Error Message" ,MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
g_bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPV5HEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPV5HEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
MessageBox(0,"Error alloc memory!","ErrorMessage",MB_OK|
MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
lpImgData=(LPBITMAPV5HEADER)GlobalLock(hImgData);
_llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);
_hread(hf,(char *)lpImgData,(long)sizeof(BITMAPV5HEADER)+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
_lclose(hf);
if(NumColors!=0)
{
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY));
pPal =(LOGPALETTE *)LocalLock(hPal);
pPal->palNumEntries =(WORD) NumColors;
pPal->palVersion = 0x300;
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPV5HEADER));
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=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal);
}
hDc=GetDC(0);
if(hPalette)
{
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
}// int WINAPI GetDIBits(HDC, HBITMAP, UINT, UINT, LPVOID, LPBITMAPINFO, UINT);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPV5HEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData,
DIB_RGB_COLORS);
if(hPalette && hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
}
ReleaseDC(0,hDc);
GlobalUnlock(hImgData);
return TRUE;
}