SetStretchBltMode() 防止图片失真

本文探讨了使用StretchBlt进行图像缩放时出现失真的原因,并介绍了两种解决方案:COLORONCOLOR和HALFTONE。通过提供具体代码示例和效果对比图,深入分析了每种方法的实现过程和优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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


直接上三个效果图吧:

 

 

 

 

测试代码链接:

转载于:https://www.cnblogs.com/hgy413/archive/2011/09/17/3693590.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值