注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【总结】StretchBlt拉伸绘制之图像失真处理  

2011-08-23 14:08:03|  分类: vc界面编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

默认情况下,StretchBlt缩小图片显示时,将源区域的多个点绘制到目标区域的一个点,因而导致图片失真。

方法(1):SetStretchBltMode( hdc,  HALFTONE );

         其原理就是像素均衡。

方法(2): SetStretchBltMode( hdc,  COLORONCOLOR );

         其原理是删除多余像素。
方法(3):

         重采样。

参考:

解决 StretchBlt 产生的像素堆积问题
http://www.cnblogs.com/hoodlum1980/archive/2010/01/26/1657098.html

 

以下源码取自上面的链接:

//缩放复制
void StretchBltFast(CImage* pDest, int xDest, int yDest, int cxDest, int cyDest, 
    CImage* pSrc, int xSrc, int ySrc, int cxSrc, int cySrc)
{
    int i,j,k;
    LPBYTE pBitsSrc = (LPBYTE)(pSrc->GetBits()); //数据块起始位置
    LPBYTE pBitsDest = (LPBYTE)(pDest->GetBits());//数据块起始位置
    LPBYTE pixAddrSrc = pBitsSrc;
    LPBYTE pixAddrDest = pBitsDest;
    int strideSrc = pSrc->GetPitch(); //pitch有时为负
    int strideDest = pDest->GetPitch();
    int bytesPerPixelSrc = pSrc->GetBPP()/8;
    int bytesPerPixelDest = pDest->GetBPP()/8;
    
    for (j = 0; j < cyDest; j++)
    {
        for (i = 0; i < cxDest; i++)
        {
            pixAddrSrc = pBitsSrc + (j * cySrc / cyDest) * strideSrc + (i * cxSrc / cxDest) *  bytesPerPixelSrc;
            pixAddrDest = pBitsDest + strideDest * j  + i  * bytesPerPixelDest;
            //复制当前像素
            for (k = 0; k < bytesPerPixelDest; k++, pixAddrDest++)
            {
                *pixAddrDest = *pixAddrSrc;
                //是否可以移动到下一个通道?
                if(k < bytesPerPixelSrc - 1) pixAddrSrc++;
            }
        }
    }
}

 

方法(4):

使用CxImage类。

 

By:zhanyonhu

  评论这张
 
阅读(810)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016