当用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();
直接上三个效果图吧: