📄 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;
////////颜色数量的确定
if(bi.biClrUsed==0) //bi.biClrUsed即为实际用到的颜色数
{
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);
///产生调色盘
if(NumColors!=0) //NumColors不为零,说明用到了调色板
{
//为逻辑调色板分配局部内存,大小为逻辑调色板结构长度加
//NumColors个PALETTENTRY
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors* sizeof(PALETTEENTRY));
//指针pPal指向该内存区
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++; //指针移到下一项
}
//产生逻辑调色板,hPalette是一个全局变量
hPalette=CreatePalette(pPal);
//释放局部内存
LocalUnlock(hPal);
LocalFree(hPal);
}
//获得设备上下文句柄
hDc=GetDC(hWnd);
if(hPalette) //如果刚才产生了逻辑调色板
{
//将新的逻辑调色板选入DC,将旧的逻辑调色板句柄保存在//hPrevPalette
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
}
//产生位图句柄
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; //模板前面所乘的系数
float CoefArray[9]; //模板数组
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 + -