⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lapls.cpp

📁 用数字图像处理主要是为了修改图形,改善图像质量,或是从图像中提起有效信息,还有利用数字图像处理可以对图像进行体积.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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)//修改图像数据每一象素的值
{	
	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);
		//拉普拉斯实现
	for(y=2;y<bi.biHeight-2;y++)
		for(x=2;x<bi.biWidth-2;x++){//以该点为中心的5*5矩形内的所有象素乘以算子系数之和如果大于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,它存储了图像的信息头、调色板和图像数据象素值。获得一个调色板HPALETTE,
//它保存图像调色板信息。获得实际用到的颜色数
{
	//局部变量	
	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指定表示颜色时一个象素所要用到的位数,常用的值为1(黑白二色图), 
//4(16色图), 8(256色), 24(真彩色图)(新的.bmp格式支持32位色,这里就不做讨论了)
	DWORD ImgSize;
	ImgSize=(DWORD)LineBytes*bi.biHeight;
	if(bi.biClrUsed!=0)//biClrUsed指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为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为从文件头到实际的位图数据的偏移字节数
			+sizeof(BITMAPINFOHEADER)))
		{
			AfxMessageBox("请输入正确的位图!",MB_OK|MB_ICONEXCLAMATION);
			_lclose(hf);
			return FALSE; 
		}
		bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;//bfSize指定文件大小

		//创建全局内存对象并填充数据(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);

//创建调色板
		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为新图的颜色数
	NewBitCount=bi.biBitCount;  //NewBitCount为新图的一个象素需要的位数
	if(NumColors==0) //真彩图
	{
		NewNumColors=256;
		NewBitCount=8;
	}
	
	//由于颜色位数有可能发生了改变,所以要重新计算每行占用的字节数以及新图
	//的缓冲区大小
	DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -