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

📄 jihebianhuandib.cpp

📁 VC++图像处理程序设计配套光盘的设计源码 VC++ImageProcessingProgrammeDesign
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	LONG	newheight;
	// 指向源图像的指针
	LPBYTE	p_data ;
	LPBYTE  temp;
    temp=this->GetData();
    p_data= temp;
	// 指向源象素的指针
	LPBYTE	lpSrc;
	// 指向缩放图像对应象素的指针
	LPBYTE	lpDst;
	// 指向缩放图像的指针
	LPBYTE	hDIB;
	// 循环变量(象素在新DIB中的坐标)
	LONG	i;
	LONG	j;
	// 象素在源DIB中的坐标
	LONG	i0;
	LONG	j0;
	if(m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{
		// 获取图像的宽度
		wide = this->GetWidth();
		LineBytes=(wide*8+31)/32*4;
		// 获取图像的高度
		height = this->GetHeight();
		// 计算缩放后的图像实际宽度和高度
		// 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分
		newwide = (LONG) (wide * xzoom  + 0.5);
		newheight = (LONG) (height * yzoom  + 0.5);
		// 分配内存,以保存新DIB
		hDIB = new BYTE[ newwide * newheight*3 ];
		int k1 =yzoom+ 0.5;
		int k2 =xzoom+ 0.5;
		// 针对图像每行进行操作
		for(j = 0; j < height-1; j=j+k1)
		{
			// 针对图像每列进行操作
			for(i = 0; i < wide-1; i=i+k2)
			{
				// 指向新DIB第i行,第j个象素的指针
				// 注意此处宽度和高度是新DIB的宽度和高度
				lpDst = (LPBYTE)hDIB  + newwide * j + i;
				// 计算该象素在源DIB中的坐标
				j0 = (LONG) (j / yzoom  + 0.5);
				i0 = (LONG) (i / xzoom  + 0.5);
				// 判断是否在源图范围内
				if( (i0 >= 0) && (i0 < wide) && (j0 >= 0) && (j0 < height))
				{
					// 指向源DIB第i0行,第j0个象素的指针
					lpSrc = (LPBYTE)p_data + wide * j0 + i0;
					// 复制象素
					*lpDst = *lpSrc;
				}
				else
				{
					// 对于源图中没有的象素,直接赋值为255
					*lpDst = 255;
				}
			}
		}
		// 复制缩小后的图像
		for(j=0;j<height;j++)
		{	
			for(i=0;i<wide;i++)
			{
				if(j<=newheight&&i<=newwide)
				{ 
					lpDst = (LPBYTE)hDIB  + newwide * j + i;
					*p_data=*lpDst;		     
				}
				else *p_data=255;
				p_data++;
			}
		}	    
		delete hDIB; 
	}
	else	//24位彩色
	{
		// 获取图像的宽度
		wide = this->GetDibWidthBytes();
		LineBytes = (((wide * 8)+31)/32*4);
		// 获取图像的高度
		height = this->GetHeight();
		// 计算缩放后的图像实际宽度
		// 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分
		newwide = (LONG) (LineBytes * xzoom  + 0.5);
		// 计算缩放后的图像高度
		newheight = (LONG) (height * yzoom  + 0.5);
		// 分配内存,以保存新DIB
		hDIB = new BYTE[ newwide * newheight*3 ];
		int k1 =(int)(yzoom+ 0.5);
		int k2 =(int)(xzoom+ 0.5);
		// 针对图像每行进行操作
		for(j = 0; j < height-1; j=j+k1)
		{
			// 针对图像每列进行操作
			for(i = 0; i < LineBytes-1; i=i+k2*3)
			{
				// 指向新DIB第i行,第j个象素的指针
				// 注意此处宽度和高度是新DIB的宽度和高度
				lpDst = (LPBYTE)hDIB  + newwide * j + i;			
				// 计算该象素在源DIB中的坐标
				j0 = (LONG) (j / yzoom  + 0.5);
				i0 = (LONG) (i / xzoom  + 0.5);
				// 判断是否在源图范围内
				if( (i0 >= 0) && (i0 < LineBytes) && (j0 >= 0) && (j0 < height))
				{				
					// 指向源DIB第i0行,第j0个象素的指针
					lpSrc = (LPBYTE)p_data + LineBytes * j0 + i0;
					// 复制象素
					*lpDst = *lpSrc;
					*(lpDst+1)=*(lpSrc+1);
					*(lpDst+2)=*(lpSrc+2);               
				}
				else
				{
					// 对于源图中没有的象素,直接赋值为255
					*lpDst = 255;
				}
			}
		}
		// 复制缩小后的图像
		for(j=0;j<height;j++)
		{	
			for(i=0;i<LineBytes;i++)
			{
				if(j<=newheight&&i<=newwide)
				{   
					lpDst = (LPBYTE)hDIB  + newwide * j + i;
					*p_data=*lpDst;
				
				}
				else *p_data=255;
				
				p_data++;
			}
		}
	}
}

/***************************************************************/           
/*函数名称:PingYi(int m_Xmove, int m_Ymove)                                       
/*函数类型:void
/*参数说明:m_Xmove 图像的水平平移量,m_Ymove 图像的垂直平移量                                    
/*功能:对图像进行平移显示。            
/***************************************************************/ 
void JiHeBianHuanDib::PingYi(int m_Xmove, int m_Ymove)
{
	// 指向源图像的指针
	LPBYTE	lpSrc;
    LPBYTE   p_data;
	// 指向要复制区域的指针
	LPBYTE	lpDst;
	// 指向复制图像的指针
	LPBYTE	temp;
	// 循环变量
	int	i,j;
	//图像的高和宽
	LONG wide,height;
	// 图像每行的字节数
	LONG lLineBytes;
	p_data=GetData();
	wide=GetWidth();
	height=GetHeight();
	if (m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{	
		// 计算图像每行的字节数
		lLineBytes = (((wide * 8)+31)/32*4);	
		// 暂时分配内存,以保存新图像
		temp=new BYTE [lLineBytes*height];
		// 初始化新分配的内存,设定初始值为255
		lpDst = (LPBYTE)temp;
		memset(lpDst, (BYTE)255, lLineBytes * height);
		// 每行
		for( i = 0; i < wide; i++)
		{
			// 每列
			for( j = 0; j < height; j++)
			{
				// 计算该象素在源DIB中的坐标
				lpSrc = (LPBYTE)p_data + lLineBytes * (height - 1 - j) + i;
				int i0,j0;
				// 计算该象素在新DIB中的坐标
				i0 = i+m_Xmove;
				j0 = j + m_Ymove;
				// 判断是否在新图范围内
				if( (i0 >= 0) && (i0 < wide) && (j0 >= 0) && (j0 < height))
				{
					lpDst = (LPBYTE)temp + lLineBytes *(height - 1 - j0) + i0;
					// 复制象素
					*lpDst = *lpSrc;
				}
				else
				{
					// 对于源图中没有的象素,直接赋值为255
					* ((unsigned char*)lpDst) = 255;
				}
			}
		}
		// 复制平移后的图像
		memcpy(p_data, temp, lLineBytes * height);
		// 释放内存
		delete temp;
	}
    else 	//24位彩色
    { 	     
		wide=this->GetDibWidthBytes() ;   //取得原图的每行字节数
		BYTE *temp=new BYTE[height*wide];
		// 初始化新分配的内存,设定初始值为255
		lpDst = (LPBYTE)temp;
		memset(lpDst, (BYTE)255, wide * height);
		// 每列
		for(int j = 0; j < height; j++)
		{
			// 每行
			for( i = 0; i < wide; i++)
			{			
				// 计算该象素在源DIB中的坐标
				lpSrc = (LPBYTE)p_data + wide * (height - 1 - j) + i;
				int i0,j0;
				// 计算该象素在新DIB中的坐标
				i0 = i+m_Xmove*3;
				j0 = j + m_Ymove;
				
				// 判断是否在新图范围内
				if( (i0 >= 0) && (i0 < wide) && (j0 >= 0) && (j0 < height))
				{
					lpDst = (LPBYTE)temp + wide*(height - 1 - j0) + i0;
					// 复制象素
					*lpDst = *lpSrc;
				}
				else
				{
					// 对于源图中没有的象素,直接赋值为255
					* ((unsigned char*)lpDst) = 255;
				}			
			}
		}
		// 复制平移后的图像
		memcpy(p_data, temp, wide * height);
	}
}

///*********************************************************************************/           
/*函数名称:FangDa(LPBYTE temp,float xzoom ,float yzoom,LONG wide,LONG	height,LONG	newwide,LONG newheight)
/*函数类型:LPBYTE 
/*参数说明:temp  --新图像的首地址
/*          xzoom --水平放大的比率
/*          yzoom --垂直放大的比率  
/*          wide  --原图像的宽度
/*			height--原图像的高度
/*			newwide--新图像的宽度
/*			newheight--新图像的高度
/*函数类型:LPBYTE                         
/*功能:对图像进行放大处理。            
/************************************************************************************/
LPBYTE JiHeBianHuanDib::FangDa(LPBYTE temp, float xzoom, float yzoom,LONG wide,LONG	height,LONG	newwide,LONG newheight)
{
	// 指向源图像的指针
	LPBYTE	p_data ;
	LPBYTE  temp1;
	// 指向源象素的指针
	LPBYTE	lpSrc;
	// 指向缩放图像对应象素的指针
	LPBYTE	lpDst;
	int	i;
	int	j;
	// 象素在源DIB中的坐标
	int	i0;
	int	j0;
	p_data=this->GetData();
	// 获取图像的宽度
	int	k1=(int)yzoom ;
    int	k2= (int)xzoom ; 
	if(m_pBitmapInfoHeader->biBitCount<9)		//灰度图像
	{
		temp1 = new BYTE[newwide * newheight];
		memset(temp1,(BYTE)255,newwide * newheight);		
		// 针对图像每行进行操作
		for(j = 0; j < newheight; j++)
		{
			// 针对图像每列进行操作
			for(i = 0; i < newwide; i++)
			{
				lpDst = (LPBYTE)temp1+newwide*j+i;
				i0=(int)(i/xzoom+0.5);
				j0=(int)(j/yzoom+0.5);	
				if( (i0 >= 0) && (i0 < wide) && (j0 >= 0) && (j0 < height))
				{
					lpSrc=(LPBYTE)p_data + wide * j0 + i0;	
					*lpDst=*lpSrc;
				}
			}
		}   
		temp=temp1;
		return temp; 
	}
	else	//24位彩色		
	{
		// 分配内存,以保存新DIB
		temp1 = new BYTE[newwide * newheight*4];
		memset(temp1,255,newwide * newheight*4);
		int r,g,b;
		// 针对图像每行进行操作
		for(j = 0; j < height; j++)
		{
			// 针对图像每列进行操作
			for(i = 0; i < wide; i++)
			{
				lpSrc = (LPBYTE)p_data + wide * j*3 + i*3;
				r=*lpSrc++;
				g=*lpSrc++;
				b=*lpSrc;
				// 复制象素
				for(int n=0;n<k1;n++)
				for(int m=0;m<k2;m++)
				{
					// 指向源DIB第i0行,第j0个象素的指针	
					lpDst = (LPBYTE)temp1  + newwide *(j*k1+n) + (i+m)*k2*3;
					*lpDst++ = r;   
					*lpDst++ = g;      
					*lpDst = b;		
				}
			}
		}
		// 复制转置后的图像	
		temp=temp1;
		// 释放内存
		return temp;
	}
}

⌨️ 快捷键说明

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