?? lapls.cpp
字號:
#include "StdAfx.h"
#include "MyInterface.h"
#include "MyInterfaceDlg.h"
#include "Picture.h"
#include <math.h>
#include ".\lapls.h"
#define WIDTHBYTES(i) ((i+31)/32*4)
int GrayTable[256];
int MaxGrayNum;
int MinGrayNum;
WNDPROC OldProc;
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
CLapls::CLapls(void)
{
wnd=NULL;
}
CLapls::~CLapls(void)
{
if(wnd!=NULL)
{
delete wnd;
wnd=NULL;
}
}
HBITMAP CLapls::Go(HWND hWnd,BOOL b)//修改圖像數(shù)據(jù)每一象素的值
{
DWORD OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
float coef;
float TempNum;
float Template_Log[25]={-2.0f,-4.0f,-4.0f,-4.0f,-2.0f,//拉普拉斯算子
-4.0f,0.0f,8.0f,0.0f,-4.0f,
-4.0f,8.0f,24.0f,8.0f,-4.0f,
-4.0f,0.0f,8.0f,0.0f,-4.0f,
-2.0f,-4.0f,-4.0f,-4.0f,-2.0f};
if(b)
{
Template_Log[0]=-1.0f;
Template_Log[1]=0.0f;
Template_Log[2]=1.0f;
Template_Log[3]=-2.0f;
Template_Log[4]=0.0f;
Template_Log[5]=2.0f;
Template_Log[6]=-1.0f;
Template_Log[7]=0.0f;
Template_Log[8]=1.0f;
Template_Log[9]=0.0f;
Template_Log[10]=0.0f;
Template_Log[11]=0.0f;
Template_Log[12]=0.0f;
Template_Log[13]=0.0f;
Template_Log[14]=0.0f;
Template_Log[15]=0.0f;
Template_Log[16]=0.0f;
Template_Log[17]=0.0f;
Template_Log[18]=0.0f;
Template_Log[19]=0.0f;
Template_Log[20]=0.0f;
Template_Log[21]=0.0f;
Template_Log[22]=0.0f;
Template_Log[23]=0.0f;
Template_Log[24]=0.0f;
}
coef=(float)(1.0);
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
AfxMessageBox("請輸入正確的位圖!",MB_OK|MB_ICONEXCLAMATION);
return NULL;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
lpPtr=(char *)lpImgData;
lpTempPtr=(char *)lpTempImgData;
memcpy(lpTempPtr,lpPtr,BufSize);
//拉普拉斯實現(xiàn)
for(y=2;y<bi.biHeight-2;y++)
for(x=2;x<bi.biWidth-2;x++){//以該點為中心的5*5矩形內(nèi)的所有象素乘以算子系數(shù)之和如果大于255,則中心象素被更改255,
//否則被賦為和的絕對值
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;
TempNum=(float)((unsigned char)*(lpPtr+2*LineBytes-2))*Template_Log[0];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes-1))*Template_Log[1];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes))*Template_Log[2];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes+1))*Template_Log[3];
TempNum+=(float)((unsigned char)*(lpPtr+2*LineBytes+2))*Template_Log[4];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes-2))*Template_Log[5];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes-1))*Template_Log[6];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*Template_Log[7];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*Template_Log[8];
TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+2))*Template_Log[9];
TempNum+=(float)((unsigned char)*(lpPtr-2))*Template_Log[10];
TempNum+=(float)((unsigned char)*(lpPtr-1))*Template_Log[11];
TempNum+=(float)((unsigned char)*(lpPtr))*Template_Log[12];
TempNum+=(float)((unsigned char)*(lpPtr+1))*Template_Log[13];
TempNum+=(float)((unsigned char)*(lpPtr+2))*Template_Log[14];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-2))*Template_Log[15];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*Template_Log[16];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*Template_Log[17];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*Template_Log[18];
TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+2))*Template_Log[19];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes-2))*Template_Log[20];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes-1))*Template_Log[21];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes))*Template_Log[22];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes+1))*Template_Log[23];
TempNum+=(float)((unsigned char)*(lpPtr-2*LineBytes+2))*Template_Log[24];
TempNum*=coef;
if(TempNum>255.0) *lpTempPtr=(BYTE)255;
else if(TempNum<0.0)
*lpTempPtr=(unsigned char)fabs(TempNum);
else *lpTempPtr=(BYTE)TempNum;
}
HWND hLib=(HWND)::GetDlgItem(hWnd,IDC_PIC_LIB);
hDc=::GetDC(hLib);
if(hBitmap!=NULL)
DeleteObject(hBitmap);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
CPicture pic;
pic.ShowPic(hBitmap,hWnd,IDC_PIC_LIB);
hf=_lcreat("c:\\log.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
::ReleaseDC(hLib,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return hBitmap;
}
BOOL CLapls::Get(char* BmpFileName)//獲得一個HGLOBAL,它存儲了圖像的信息頭、調(diào)色板和圖像數(shù)據(jù)象素值。獲得一個調(diào)色板HPALETTE,
//它保存圖像調(diào)色板信息。獲得實際用到的顏色數(shù)
{
//局部變量
HLOCAL hPal;
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
LPBITMAPINFOHEADER lpImgData;
//讀取位圖基本信息
HFILE hf;
if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){
AfxMessageBox("File not found!");
return FALSE;
}
_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER));
//保存信息到類變量中
ImgWidth=bi.biWidth;
ImgHeight=bi.biHeight;
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);//biBitCount指定表示顏色時一個象素所要用到的位數(shù),常用的值為1(黑白二色圖),
//4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支持32位色,這里就不做討論了)
DWORD ImgSize;
ImgSize=(DWORD)LineBytes*bi.biHeight;
if(bi.biClrUsed!=0)//biClrUsed指定本圖象實際用到的顏色數(shù),如果該值為零,則用到的顏色數(shù)為2^biBitCount
NumColors=(DWORD)bi.biClrUsed;
else
switch(bi.biBitCount){
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:
AfxMessageBox("請輸入正確的位圖!",MB_OK|MB_ICONEXCLAMATION);//Invalid color numbers
_lclose(hf);
return FALSE;
}
//檢查錯誤
if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)//bfOffBit為從文件頭到實際的位圖數(shù)據(jù)的偏移字節(jié)數(shù)
+sizeof(BITMAPINFOHEADER)))
{
AfxMessageBox("請輸入正確的位圖!",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;//bfSize指定文件大小
//創(chuàng)建全局內(nèi)存對象并填充數(shù)據(jù)(bi+quad+image)
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
AfxMessageBox("Error alloc memory!",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
_llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);//_llseek移動文件的讀寫位置,成功返回移動后的文件讀寫位置
_hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER)
+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
_lclose(hf);
//創(chuàng)建調(diào)色板
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(BITMAPINFOHEADER));
for (DWORD 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);
}
GlobalUnlock(hImgData);
return TRUE;
}
HBITMAP CLapls::ColortoGrayScale(HWND hWnd)
{
HWND hpic=::GetDlgItem(hWnd,IDC_PIC);
DWORD SrcBufSize,DstBufSize,DstLineBytes;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
BITMAPFILEHEADER DstBf;
BITMAPINFOHEADER DstBi;
LOGPALETTE *pPal;
HPALETTE hPrevPalette;
HLOCAL hPal;
DWORD NewNumColors;
WORD NewBitCount;
float Y;
DWORD i;
unsigned char Red,Green,Blue,Gray;
NewNumColors=NumColors; //NewNumColors為新圖的顏色數(shù)
NewBitCount=bi.biBitCount; //NewBitCount為新圖的一個象素需要的位數(shù)
if(NumColors==0) //真彩圖
{
NewNumColors=256;
NewBitCount=8;
}
//由于顏色位數(shù)有可能發(fā)生了改變,所以要重新計算每行占用的字節(jié)數(shù)以及新圖
//的緩沖區(qū)大小
DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -