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

📄 effect.cpp

📁 一个国人自己实现图像库的程序(有参考价值)
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		this->AddToUndoList () ;

	if (m_hSelRgn == NULL)
	{
		BYTE	* pDest = this->GetBits (Height() - 1),
				* pSrc = this->GetBits (Height() - 1 - iHeight) ;
		DWORD	dwPitch = this->GetPitch () ;
		MoveMemory (pDest, pSrc, (Height() - iHeight) * dwPitch) ;
		FillMemory (this->GetBits (iHeight-1), dwPitch * iHeight, 0xFF) ;
	}
	else
	{
		FCDibEffect		block ;
		this->GetSubBlock (&block, m_SelRect) ;
		block.ShiftDown (iHeight) ;
		this->__BltBlock (block, m_SelRect.left, m_SelRect.top) ;
	}
}
//===================================================================
void  FCDibEffect::Rotate270 ()
{
	if (this->ColorBits() < 8)
		return ;

	FCDib		* Old = NULL ;
	if (m_UndoFlag) // 保存当前图象
	{
		this->AddToUndoList () ;
		Old = m_UndoList.back () ; // return FCDib*
	}	
	else
	{
		Old = new FCDib ;
		* Old = * (FCDib *) this ; // 保存当前图象
	}

	if (this->Create (Old->Height(), Old->Width(), Old->ColorBits()))
	{
		DWORD	dwPitch = this->GetPitch (),
				dwOldPitch = Old->GetPitch () ;
		for (int y = 0 ; y < this->Height() ; y++)
		{
			BYTE	* pDest = (BYTE *) this->GetBits (y) ;
			BYTE	* pSrc = (BYTE *) Old->GetBits (Old->Width() - 1 - y, 0) ;
			for (int x = 0 ; x < this->Width() ; x++, pSrc -= dwOldPitch)
				this->__SetPixelData (pDest, x, pSrc) ;
		}
		this->__CopyPalette (*Old) ;
	}
	if (!m_UndoFlag)
		delete Old ;
}
//===================================================================
void  FCDibEffect::Rotate (int iAngle)
{
	if ((this->GetHandle() == NULL) || (iAngle < 1) || (iAngle >= 90))
		return ;

	FCDib		* Old = NULL ;
	if (m_UndoFlag) // 保存当前图象
	{
		this->AddToUndoList () ;
		Old = m_UndoList.back () ; // return FCDib*
	}	
	else
	{
		Old = new FCDib ;
		* Old = * (FCDib *) this ; // 保存当前图象
	}

	double		duSinX = sin (LIB_PI * iAngle / 180.0),
				duCosX = cos (LIB_PI * iAngle / 180.0) ;
	DWORD		dwNewW = Height() * duSinX + Width() * duCosX + 1.0,
				dwNewH = Height() * duCosX + Width() * duSinX + 1.0 ;
	if (this->Create (dwNewW, dwNewH, Old->ColorBits()))
	{
		if (this->ColorBits() <= 8)
		{
			int			nNum = 1 << this->ColorBits() ;
			RGBQUAD		* prgb = (RGBQUAD *) new RGBQUAD[nNum] ;
			Old->GetColorTable (0, nNum, prgb) ;
			this->SetColorTable (0, nNum, prgb) ; // 复制调色板
			delete[] prgb ;
		}

		POINT		ptMapped[3] ;
		ZeroMemory (ptMapped, sizeof(POINT) * 3) ;
		ptMapped[0].x = Old->Height() * duSinX ;
		ptMapped[1].x = min (dwNewW - 1, Old->Height() * duSinX + Old->Width() * duCosX) ;
		ptMapped[1].y = Old->Width() * duSinX ;
		ptMapped[2].y = Old->Height() * duCosX ;

		HDC			hdcDesc = CreateCompatibleDC (NULL),
					hdcSrc  = CreateCompatibleDC (NULL) ;
		::SetStretchBltMode (hdcDesc, COLORONCOLOR) ;
		HBITMAP		hTa = (HBITMAP)SelectObject (hdcDesc, this->GetHandle ()) ;
		HBITMAP		hTb = (HBITMAP)SelectObject (hdcSrc, Old->GetHandle ()) ;
		::PlgBlt (hdcDesc, ptMapped, hdcSrc, 0, 0, Old->Width(), Old->Height(), NULL, 0, 0) ;
		SelectObject (hdcDesc, hTa) ;
		SelectObject (hdcSrc, hTb) ;
		DeleteDC (hdcDesc) ;
		DeleteDC (hdcSrc) ;
	}
	if (!m_UndoFlag)
		delete Old ;
}
//===================================================================
void  FCDibEffect::DuplicateFrame (int iLeft, int iUp, int iRight, int iDown)
{
	if ((this->ColorBits() < 24) || (iLeft < 0) || (iUp < 0) || (iRight < 0) || (iDown < 0))
		return ;

	RGBQUAD		rgbTL, rgbTR, rgbBL, rgbBR ; // 四个角的象素
	this->GetPixelColor (0, 0, &rgbTL) ;
	this->GetPixelColor (Width()-1, 0, &rgbTR) ;
	this->GetPixelColor (0, Height()-1, &rgbBL) ;
	this->GetPixelColor (Width()-1, Height()-1, &rgbBR) ;

	int		iOldW = this->Width(),
			iOldH = this->Height(),
			nSpan = this->ColorBits() / 8 ;

	this->AddFrame (iLeft, iUp, iRight, iDown) ;
	//	复制四角
	RECT	rcUpL = {0, 0, iUp, iLeft},
			rcUpR = {Width()-iRight, 0, Width(), iUp},
			rcDownL = {0, Height()-iDown, iLeft, Height()},
			rcDownR = {Width()-iRight, Height()-iDown, Width(), Height()} ;
	this->RegionFill (rgbTL, &rcUpL) ;
	this->RegionFill (rgbTR, &rcUpR) ;
	this->RegionFill (rgbBL, &rcDownL) ;
	this->RegionFill (rgbBR, &rcDownR) ;

	//	复制四边
	int			ct ;
	DWORD		dwPitch = this->GetPitch (),
				dwCopySize = nSpan * iOldW ;
	BYTE		* pSrc, * pDest ;
	//	上
	pSrc = this->GetBits (iLeft, iUp) ;
	pDest = pSrc + dwPitch ;
	for (ct = 0 ; ct < iUp ; ct++, pDest += dwPitch)
		CopyMemory (pDest, pSrc, dwCopySize) ;
	//	下
	pDest = this->GetBits (iLeft, iOldH + iUp) ;
	pSrc = pDest + dwPitch ;
	for (ct = 0 ; ct < iDown ; ct++, pDest -= dwPitch)
		CopyMemory (pDest, pSrc, dwCopySize) ;
	//	左
	pSrc = this->GetBits (iLeft, iUp) ;
	pDest = this->GetBits (0, iUp) ;
	for (ct = 0 ; ct < iOldH ; ct++, pDest -= dwPitch, pSrc -= dwPitch)
	{
		BYTE	* pTemp = pDest ;
		for (int i=0 ; i < iLeft ; i++, pTemp += nSpan)
			CopyMemory (pTemp, pSrc, nSpan) ;
	}
	//	右
	pDest = this->GetBits (iLeft + iOldW, iUp) ;
	pSrc = pDest - nSpan ;
	for (ct = 0 ; ct < iOldH ; ct++, pDest -= dwPitch, pSrc -= dwPitch)
	{
		BYTE	* pTemp = pDest ;
		for (int i=0 ; i < iRight ; i++, pTemp += nSpan)
			CopyMemory (pTemp, pSrc, nSpan) ;
	}
}
//===================================================================
void  FCDibEffect::ConvoluteDIB (int * iElement, int iBlockLen, int iDivisor)
{
	if ((this->ColorBits() < 24) || (iBlockLen < 3) || (iBlockLen >= this->Width()) || (iBlockLen >= this->Height()))
		return ;
	if (m_UndoFlag)
		this->AddToUndoList () ;

	int		iUp, iLeft, iRight, iDown ;
	iUp = iLeft = iBlockLen / 2 ;
	iDown = iRight = iUp - (iBlockLen % 2)^1 ;

	BOOL	bBak = this->m_UndoFlag ;
	this->m_UndoFlag = FALSE ;
	this->DuplicateFrame (iLeft, iUp, iRight, iDown) ;
	this->ConvoluteDIBNoEdge (iElement, iBlockLen, iDivisor) ;
	this->EraseFrame (iLeft, iUp, iRight, iDown) ;
	this->m_UndoFlag = bBak ;

}
//===================================================================
void  FCDibEffect::ConvoluteDIBNoEdge (int * iElement, int iBlockLen, int iDivisor)
{
	if ((this->ColorBits() < 24) || (iBlockLen < 3) || (iBlockLen >= this->Width()) || (iBlockLen >= this->Height()))
		return ;
	if (m_UndoFlag)
		this->AddToUndoList () ;

	if (m_hSelRgn == NULL) // 整图
	{
		FCDib	* old ;
		if (m_UndoFlag) // 当前图象已经保存
			old = m_UndoList.back () ;
		else
		{
			old = new FCDib ;
			* old = * (FCDib *) this ; // 保存当前图象
		}

		// 从上往下开始计算
		int			iXStart, iYStart, iXEnd, iYEnd,
					nSpan = this->ColorBits() / 8 ;
		iXStart = iYStart = iBlockLen/2 ; // 左上角的起始位置
		iXEnd = Width() - iBlockLen ;	// X结束位置
		iYEnd = Height() - iBlockLen ;	// Y结束位置

		DWORD		dwPitch = this->GetPitch() + iBlockLen * nSpan ;
		for (int y = 0 ; y <= iYEnd ; y++)
		{
			BYTE	* pStart = old->GetBits (y) ;
			BYTE	* pWrite = this->GetBits (iXStart, y + iYStart) ;
			for (int x = 0 ; x <= iXEnd ; x++, pStart += nSpan, pWrite += nSpan)
			{
				// 计算子块
				BYTE	* pCurr = pStart ;
				int		dwSumR = 0, dwSumG = 0, dwSumB = 0, iCount = 0 ;
				for (int smY = 0 ; smY < iBlockLen ; smY++, pCurr -= dwPitch)
					for (int smX = 0 ; smX < iBlockLen ; smX++, pCurr += nSpan)
					{
						dwSumB += pCurr[0] * iElement[iCount] ;
						dwSumG += pCurr[1] * iElement[iCount] ;
						dwSumR += pCurr[2] * iElement[iCount++] ;
					}
				// 设置象素值
				pWrite[0] = max (min (dwSumB / iDivisor, 255), 0) ;
				pWrite[1] = max (min (dwSumG / iDivisor, 255), 0) ;
				pWrite[2] = max (min (dwSumR / iDivisor, 255), 0) ;
			}
		}
		if (!m_UndoFlag)
			delete old ;
	}
	else
	{
		FCDibEffect		block ;
		this->GetSubBlock (&block, m_SelRect) ;
		block.ConvoluteDIB (iElement, iBlockLen, iDivisor) ;
		this->__BltBlock (block, m_SelRect.left, m_SelRect.top) ;
	}
}
//===================================================================
void  FCDibEffect::Algorithm (int iAlgorithm)
{
	int		iElement[9] ;
	switch (iAlgorithm)
	{
		case EFFECT_SMOOTH_1 :
			iElement[0] = 1 ; iElement[1] = 1 ; iElement[2] = 1 ;
			iElement[3] = 1 ; iElement[4] = 1 ; iElement[5] = 1 ;
			iElement[6] = 1 ; iElement[7] = 1 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 9) ; break ;

		case EFFECT_SMOOTH_2 :
			iElement[0] = 1 ; iElement[1] = 1 ; iElement[2] = 1 ;
			iElement[3] = 1 ; iElement[4] = 2 ; iElement[5] = 1 ;
			iElement[6] = 1 ; iElement[7] = 1 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 10) ; break ;

		case EFFECT_SMOOTH_3 :
			iElement[0] = 1 ; iElement[1] = 2 ; iElement[2] = 1 ;
			iElement[3] = 2 ; iElement[4] = 4 ; iElement[5] = 2 ;
			iElement[6] = 1 ; iElement[7] = 2 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 16) ; break ;

		case EFFECT_SHARP_1 :
			iElement[0] =-1 ; iElement[1] =-1 ; iElement[2] =-1 ;
			iElement[3] =-1 ; iElement[4] = 9 ; iElement[5] =-1 ;
			iElement[6] =-1 ; iElement[7] =-1 ; iElement[8] =-1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_SHARP_2 :
			iElement[0] = 0 ; iElement[1] =-1 ; iElement[2] = 0 ;
			iElement[3] =-1 ; iElement[4] = 5 ; iElement[5] =-1 ;
			iElement[6] = 0 ; iElement[7] =-1 ; iElement[8] = 0 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_SHARP_3 :
			iElement[0] = 1 ; iElement[1] =-2 ; iElement[2] = 1 ;
			iElement[3] =-2 ; iElement[4] = 5 ; iElement[5] =-2 ;
			iElement[6] = 1 ; iElement[7] =-2 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_VERT :
			iElement[0] = 0 ; iElement[1] = 0 ; iElement[2] = 0 ;
			iElement[3] =-1 ; iElement[4] = 1 ; iElement[5] = 0 ;
			iElement[6] = 0 ; iElement[7] = 0 ; iElement[8] = 0 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_HORZ :
			iElement[0] = 0 ; iElement[1] =-1 ; iElement[2] = 0 ;
			iElement[3] = 0 ; iElement[4] = 1 ; iElement[5] = 0 ;
			iElement[6] = 0 ; iElement[7] = 0 ; iElement[8] = 0 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_VERTHORZ :
			iElement[0] =-1 ; iElement[1] = 0 ; iElement[2] = 0 ;
			iElement[3] = 0 ; iElement[4] = 1 ; iElement[5] = 0 ;
			iElement[6] = 0 ; iElement[7] = 0 ; iElement[8] = 0 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_NORTH :
			iElement[0] = 1 ; iElement[1] = 1 ; iElement[2] = 1 ;
			iElement[3] = 1 ; iElement[4] =-2 ; iElement[5] = 1 ;
			iElement[6] =-1 ; iElement[7] =-1 ; iElement[8] =-1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_SOUTH :
			iElement[0] =-1 ; iElement[1] =-1 ; iElement[2] =-1 ;
			iElement[3] = 1 ; iElement[4] =-2 ; iElement[5] = 1 ;
			iElement[6] = 1 ; iElement[7] = 1 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_WEST :
			iElement[0] = 1 ; iElement[1] = 1 ; iElement[2] =-1 ;
			iElement[3] = 1 ; iElement[4] =-2 ; iElement[5] =-1 ;
			iElement[6] = 1 ; iElement[7] = 1 ; iElement[8] =-1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_EAST :
			iElement[0] =-1 ; iElement[1] = 1 ; iElement[2] = 1 ;
			iElement[3] =-1 ; iElement[4] =-2 ; iElement[5] = 1 ;
			iElement[6] =-1 ; iElement[7] = 1 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;
	
		case EFFECT_ENHANCE_NORTHEAST :
			iElement[0] = 1 ; iElement[1] = 1 ; iElement[2] = 1 ;
			iElement[3] =-1 ; iElement[4] =-2 ; iElement[5] = 1 ;
			iElement[6] =-1 ; iElement[7] =-1 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_SOUTHWEST :
			iElement[0] = 1 ; iElement[1] =-1 ; iElement[2] =-1 ;
			iElement[3] = 1 ; iElement[4] =-2 ; iElement[5] =-1 ;
			iElement[6] = 1 ; iElement[7] = 1 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_NORTHWEST :
			iElement[0] = 1 ; iElement[1] = 1 ; iElement[2] = 1 ;
			iElement[3] = 1 ; iElement[4] =-2 ; iElement[5] =-1 ;
			iElement[6] = 1 ; iElement[7] =-1 ; iElement[8] =-1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_SOUTHEAST :
			iElement[0] =-1 ; iElement[1] =-1 ; iElement[2] = 1 ;
			iElement[3] =-1 ; iElement[4] =-2 ; iElement[5] = 1 ;
			iElement[6] =-1 ; iElement[7] =-1 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;
		
		case EFFECT_ENHANCE_LAPLACE1 :
			iElement[0] = 0 ; iElement[1] = 1 ; iElement[2] = 0 ;
			iElement[3] = 1 ; iElement[4] =-4 ; iElement[5] = 1 ;
			iElement[6] = 0 ; iElement[7] = 1 ; iElement[8] = 0 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_LAPLACE2 :
			iElement[0] =-1 ; iElement[1] =-1 ; iElement[2] =-1 ;
			iElement[3] =-1 ; iElement[4] = 8 ; iElement[5] =-1 ;
			iElement[6] =-1 ; iElement[7] =-1 ; iElement[8] =-1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_LAPLACE3 :
			iElement[0] =-1 ; iElement[1] =-1 ; iElement[2] =-1 ;
			iElement[3] =-1 ; iElement[4] = 9 ; iElement[5] =-1 ;
			iElement[6] =-1 ; iElement[7] =-1 ; iElement[8] =-1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;

		case EFFECT_ENHANCE_LAPLACE4 :
			iElement[0] = 1 ; iElement[1] =-2 ; iElement[2] = 1 ;
			iElement[3] =-2 ; iElement[4] = 4 ; iElement[5] =-2 ;
			iElement[6] = 1 ; iElement[7] =-2 ; iElement[8] = 1 ;
			this->ConvoluteDIB (iElement, 3, 1) ; break ;
	}
}
//===================================================================

⌨️ 快捷键说明

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