当用StretchBlt缩小时,我们经常发现它会失真:
其原因为当StrecthBlt() 的DestRect比SorRECT小時 必須要將一些点去掉
他的预设做法 是將要去掉的点与旁边的点做AND运算,所以导致像素错误,
解决方法:(原图)
COLORONCOLOR:直接將不要的点删掉.
HALFTONE:將要删掉的像素跟周围的中和起來,這样可得到较好的画质 不过效率当然要牺牲点(相当于PS的那个模糊工具)。
主要测试代码:
CRect rcClient;
GetClientRect(rcClient);
CPaintDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap *pOldBmp = dcMem.SelectObject(&m_bmp);
BITMAP bm;
m_bmp.GetBitmap(&bm);
int OldMode = -1;
switch(m_State)
{
case State_COLORONCOLOR:
OldMode = dc.SetStretchBltMode(COLORONCOLOR);
break;
case State_HALFTONE:
OldMode = dc.SetStretchBltMode(HALFTONE);
break;
default:
break;
}
dc.StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem,
0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
if(-1 != OldMode)
dc.SetStretchBltMode(OldMode);
dcMem.SelectObject(pOldBmp);
dcMem.DeleteDC();
直接上三个效果图吧: