123456

 

SetStretchBltMode() 防止图片失真

 

当用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();


直接上三个效果图吧:

 

 

 

 

测试代码链接:

posted on 2011-09-17 18:05  hgy413  阅读(518)  评论(0编辑  收藏  举报

导航