zoukankan      html  css  js  c++  java
  • 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();


    直接上三个效果图吧:

     

    测试代码链接:

  • 相关阅读:
    Sqoop相关
    Hive桶表
    Hive视图
    Hive的Explain命令
    Django路由分发
    Django对应的路由名称
    Django基于正则表达式的URL(2)
    Django基于正则表达式的URL(1)
    Django模板语言循环字典
    Django的CBV和FBV
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693590.html
Copyright © 2011-2022 走看看