?? loadbmpfile.cpp
字號:
#include "stdafx.h"
#include "LoadBmpFile.h"
#include "math.h"
///////////////////////////////////////////////////////loadBmp
BOOL load_bmp_file::LoadBmpFile (HWND hWnd,const char *BmpFileName)
{
DWORD ImgSize;
HDC hDc;
HFILE hf;
LPBITMAPINFOHEADER lpImgData;
HLOCAL hPal; //存儲調色板的局部內存句柄
LOGPALETTE *pPal; //指向邏輯調色板結構的指針
LPRGBQUAD lpRGB; //指向RGBQUAD結構的指針
HPALETTE hPrevPalette; //用來保存設備中原來的調色板
if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR )
{
MessageBox(hWnd,BmpFileName,"Open File Error!",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//讀bf
_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
//讀bi
_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER));
bi.biSizeImage= ImgSize = (DWORD)WIDTHBYTES(bi.biBitCount*bi.biWidth)*bi.biHeight;
////////顏色數(shù)量的確定
if(bi.biClrUsed==0) //bi.biClrUsed即為實際用到的顏色數(shù)
{
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;
}
}
else
NumColors=(DWORD)bi.biClrUsed;
//////////////
//分配全局內存 infoHeader+palette+img
if(hImgData!=NULL)
GlobalFree(hImgData);
if((hImgData=GlobalAlloc(GHND,
(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
MessageBox(hWnd,"Mem alloc error!","Error",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
//lpImgData鎖定內存
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
_llseek(hf,sizeof(BITMAPFILEHEADER),0);
//將文件內容讀入內存(除BITMAPFILEHEADER)
_hread(hf,(char*)lpImgData,
(long)sizeof(BITMAPINFOHEADER)+(long)sizeof(RGBQUAD)*NumColors+ImgSize);
//hf closed
_lclose(hf);
///產(chǎn)生調色盤
if(NumColors!=0) //NumColors不為零,說明用到了調色板
{
//為邏輯調色板分配局部內存,大小為邏輯調色板結構長度加
//NumColors個PALETTENTRY
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors* sizeof(PALETTEENTRY));
//指針pPal指向該內存區(qū)
pPal =(LOGPALETTE *)LocalLock(hPal);
//填寫邏輯調色板結構的頭
pPal->palNumEntries =(unsigned short) NumColors;
pPal->palVersion = 0x300;
//lpRGB指向的是調色板開始的位置
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData +
(DWORD)sizeof(BITMAPINFOHEADER));
//填寫每一項
unsigned int i;
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++; //指針移到下一項
}
//產(chǎn)生邏輯調色板,hPalette是一個全局變量
hPalette=CreatePalette(pPal);
//釋放局部內存
LocalUnlock(hPal);
LocalFree(hPal);
}
//獲得設備上下文句柄
hDc=GetDC(hWnd);
if(hPalette) //如果剛才產(chǎn)生了邏輯調色板
{
//將新的邏輯調色板選入DC,將舊的邏輯調色板句柄保存在//hPrevPalette
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
}
//產(chǎn)生位圖句柄
if(hBitmap!=NULL)
DeleteObject(hBitmap);
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;
}
////////////////////////////////////////////////////////////////////endLoadBmp
//void PopFileInitialize (HWND);
void load_bmp_file::PopFileInitialize (HWND hwnd)
{
static TCHAR szFilter[] = TEXT ("BMP Files (*.BMP)\0*.bmp\0") \
TEXT ("JPEG Files (*.JPG)\0*.jpg\0") \
TEXT ("All Files (*.*)\0*.*\0\0") ;
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = hwnd ;
ofn.hInstance = NULL ;
ofn.lpstrFilter = szFilter ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.lpstrFile = NULL ; // Set in Open and Close functions
ofn.nMaxFile = MAX_PATH ;
ofn.lpstrFileTitle = NULL ; // Set in Open and Close functions
ofn.nMaxFileTitle = MAX_PATH ;
ofn.lpstrInitialDir = NULL ;
ofn.lpstrTitle = NULL ;
ofn.Flags = 0 ; // Set in Open and Close functions
ofn.nFileOffset = 0 ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = TEXT ("bmp") ;
ofn.lCustData = 0;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
}
////////////////////
#define TEMPLATE_HORZ_SOBEL 2
#define TEMPLATE_VERT_SOBEL 1
BOOL load_bmp_file::TemplateOperation(HWND hWnd, int TemplateType,int Type)//Type==1時Add,
{
//array def
float Template_Horz_Sobel[9]={-1,0,1,-(float)sqrt(2),0,(float)sqrt(2),-1,0,1};
float Template_Horz_Sobel_Vert[9]={-1,-(float)sqrt(2),-1,0,0,0,1,(float)sqrt(2),1};
float Template_M1_Sobel[9]={2,1,0,1,0,-1,0,-1,-2};
float Template_M3_Sobel[9]={0,-1,-2,1,0,-1,2,1,0};
///////////////////////def
DWORD OffBits,BufSize,LineBytes;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
float coef; //模板前面所乘的系數(shù)
float CoefArray[9]; //模板數(shù)組
float TempNum;
char filename[80];
BYTE curColor;
int i=0;
int stringlen;
switch(TemplateType)
{ //判斷模板類型
case TEMPLATE_HORZ_SOBEL:
coef = (float)1.0;
for(i=0;i<9;i++)
{
CoefArray[i] = Template_Horz_Sobel[i];
}
break;
case TEMPLATE_VERT_SOBEL:
coef = (float)1.0;
for(i=0;i<9;i++)
{
CoefArray[i] = Template_Horz_Sobel_Vert[i];
}
break;
}
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
LineBytes =(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);
BufSize=OffBits+bi.biHeight*LineBytes;
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -