📄 effect.cpp
字号:
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 + -