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

📄 图像缩放.txt

📁 数字图像处理技术源代码
💻 TXT
字号:
////////////////////////////////////////////////////////////////
//参数说明:
// HWND hWnd:窗口句柄
//程序说明:进行图像的缩放
BOOL Zoom(HWND hWnd)
{	
	//窗口处理函数
	DLGPROC            dlgInputBox = NULL;
	//偏移、源和目标内存大小、每行字节数
	DWORD              OffBits,SrcBufSize,DstBufSize,DstLineBytes;
	//图像信息头指针和数据区指针
	LPBITMAPINFOHEADER lpImgData;
	LPSTR              lpPtr;
	HLOCAL             hTempImgData;
	LPBITMAPINFOHEADER lpTempImgData;
	LPSTR              lpTempPtr;
	//图像新旧宽度和高度
	DWORD              Wold,Hold,Wnew,Hnew;
	HDC                hDc;
	//文件句柄
	HFILE              hf;
	//用来定位象素数据位置 
	DWORD              x0,y0,x1,y1;
	float			   num1;
	//定义两个文件头结构
	BITMAPFILEHEADER   DstBf;
	BITMAPINFOHEADER   DstBi;
	//实例化对话框
	dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst );
	DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);
	FreeProcInstance ( (FARPROC) dlgInputBox );
	//得到缩放系数
	num1=(float)(1.0/ZoomRatio);
	//得到原来的宽度高度
	Wold=bi.biWidth;
	Hold=bi.biHeight;
	//计算新图像的宽度高度
	Wnew = (DWORD)(Wold*ZoomRatio+0.5);
	Hnew = (DWORD)(Hold*ZoomRatio+0.5);
	//计算数据区到文件信息头的偏移
	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
	//计算源图像所需的内存大小
	SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
	ImgWidth=Wnew;
	ImgHeight=Hnew;
	//得到目标图像中每行象素的字节数
	DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount);
	//目标图像所需内容大小
	DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew);
	
	if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)
	{
		MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
	}
	
	lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    
	lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
	//得到数据区指针
	lpPtr=(char *)lpImgData;
	lpTempPtr=(char *)lpTempImgData;
	//初始化内存
	memset(lpTempPtr,(BYTE)255,DstBufSize);
	//保存源数据
	memcpy(lpTempPtr,lpPtr,OffBits);
	
	//创建新的文件头和文件信息头
	memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));
	memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));
	DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);
	DstBi.biWidth=Wnew;
	DstBi.biHeight=Hnew;
	
	//用新的文件信息覆盖原来的值
	memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER));
	//计算新文件数据区的数据
	for(y1=0;y1<Hnew;y1++)
		for(x1=0;x1<Wnew;x1++){
			//得到横坐标、纵坐标位置在源图像中的值
			x0= (DWORD)(x1*num1);
			y0= (DWORD)(y1*num1);
			//临界判断
			if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold))
			{	
				//得到数据去位置
				lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;
				lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;
				//赋值
				*lpTempPtr=*lpPtr;
			}
		}
		
		hDc=GetDC(hWnd);
		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);
		
		//新建图像
		hf=_lcreat("c:\\zoom.bmp",0);
		//保存新图像内容
		_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 
		_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
		_lclose(hf);
		//释放资源
		ReleaseDC(hWnd,hDc);
		LocalUnlock(hTempImgData);
		LocalFree(hTempImgData);
		GlobalUnlock(hImgData);
		return TRUE;
}

⌨️ 快捷键说明

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