www.pudn.com > ImageProcessing.rar.rar > Zoom.cpp


#include "stdafx.h" 
#include "Zoom.h" 
#include "cdib.h" 
 
#include  
#include  
 
LPBYTE WINAPI Zoom(CDib* pDibBase , LONG Begin, LONG End) 
{ 
	 
	// 基准图象的宽度和高度 
	LONG lWidth, lHeight; 
	lWidth = pDibBase->m_lpBMIH->biWidth; 
	lHeight= pDibBase->m_lpBMIH->biHeight; 
 
 
	// 计算结果图象的存储大小尺寸 
	CSize sizeBase; 
	sizeBase = pDibBase->GetDibSaveDim(); 
 
 
 
 
	 
	// 截图后图像的宽度和高度 
	LONG	lNewWidth; 
	LONG	lNewHeight; 
 
 
 
	// 截图后的图象 
	CDib* m_pDibResult;	 
 
 
    //如果输入的Begin 小于0 则 
	if(Begin<0) 
		Begin=0; 
	//如果输入的End 大于lWidth 则 
	if(End>lWidth) 
		End=lWidth; 
 
 
	// 计算截图后的图像实际宽度 
	// 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分 
	lNewWidth = (LONG) (End-Begin); 
	 
	 
	 
	// 计算图像高度 
	lNewHeight = lHeight; 
 
 
 
	// 将此图象用CDib类封装 
	m_pDibResult = new CDib(CSize(lNewWidth,lNewHeight), 8); 
 
	 
 
    // 计算结果图象的存储大小尺寸 
	CSize sizeSaveResult; 
	sizeSaveResult = m_pDibResult->GetDibSaveDim(); 
 
	// 拷贝调色板 
	memcpy(m_pDibResult->m_lpvColorTable, pDibBase->m_lpvColorTable, m_pDibResult->m_nColorTableEntries*sizeof(RGBQUAD)); 
 
	// 应用调色板 
	m_pDibResult->MakePalette(); 
 
 
	 
	 
	// 指向BITMAPINFO结构的指针(Win3.0) 
	LPBITMAPINFOHEADER lpbmi; 
	 
	// 指向BITMAPCOREINFO结构的指针 
	LPBITMAPCOREHEADER lpbmc; 
	 
	// 循环变量(象素在新DIB中的坐标) 
	LONG	i; 
	LONG	j; 
	 
	// 象素在源DIB中的坐标 
	LONG	i0; 
	LONG	j0; 
 
	 
	// 获取指针 
	lpbmi = (LPBITMAPINFOHEADER)m_pDibResult->m_lpImage; 
	lpbmc = (LPBITMAPCOREHEADER)m_pDibResult->m_lpImage; 
	 
	 
	 
	 
		// 对于其它格式的DIB 
		lpbmc->bcWidth = (unsigned short) lNewWidth; 
		lpbmc->bcHeight = (unsigned short) lNewHeight; 
 
       // 分配内存给合并后的图象 
       LPBYTE lpImgResult; 
 	   lpImgResult = (LPBYTE)new unsigned char[sizeSaveResult.cx * sizeSaveResult.cy]; 
 
	   // 分配内存给合并后的图象 
       LPBYTE lpBase; 
 	   lpBase = (LPBYTE)new unsigned char[sizeBase.cx * sizeBase.cy]; 
        
 
	   //指向源图象的指针 
	   LPBYTE lpImage ; 
	   lpImage = pDibBase->m_lpImage; 
 
 
 
	 
	 
	// 针对图像每行进行操作 
	for(i = 0; i < lNewHeight; i++) 
	{ 
		// 针对图像每列进行操作 
		for(j = 0; j < lNewWidth; j++) 
		{ 
			 
			// 指向新DIB第i行,第j个象素的指针 
			// 注意此处宽度和高度是新DIB的宽度和高度 
			lpImgResult[i*sizeSaveResult.cx + j] = m_pDibResult->m_lpImage[i*sizeSaveResult.cx + j]; 
			// 计算该象素在源DIB中的坐标 
			i0 = (LONG) i; 
			j0 = (LONG) j+Begin; 
			 
			// 判断是否在源图范围内 
		 
				 
				// 指向源DIB第i0行,第j0个象素的指针 
				lpBase[i0*sizeBase.cx+j0]=pDibBase->m_lpImage[i0*sizeBase.cx+j0]; 
				 
				// 复制象素 
				lpImgResult=lpBase; 
				 
			 
			 
			 
		} 
		 
	} 
	 
	// 返回 
	return m_pDibResult->m_lpImage  ; 
	 
}