关于缩放:

    一直以来,缩放插值算法使用的要么是“最邻近插值”(以下简称邻插),要么就是“
双线性插值”(以下简称双插)。
  “邻插”实行简单,大概就是扫描新图的每个点来计算应该插的值是原图的哪个点。
伪代码:

 void StretchDib( float zoomX, zoomY ){

    for( long y = 0; y < newBmpHeight; ++y ){

        for( long x = 0; x < newBmpWidth; ++x ){

            DestBmp.SetPixel( x, y, SrcBmp.GetPixel( BOUND( x / zoomX + 0.5 ), BOUND( y / zoomY + 0.5 ) ) );

        }

    }

} //zoomX与zoomY代表两轴的缩放系数,BOUND宏检测有没越界。当然,

//不是真的叫你去GDI的SetPixel()和GetPixel(),那只是伪代码. -_-"

 

    对于普通图象来说,“邻插”除了会出现锯齿外,可以满足大部分的需求,瑕不掩瑜,
毕竟速度最快。但某次偶然的发现,使偶改变了这个看法。当偶打开一幅1BPP的文字点阵
图时,偶把它缩小一倍后,使用“邻插”的效果简直惨不忍睹(图1):

图1

 

 

    这副“尊容”确实够吓人的了,别以为算法有错误!其实这是“邻插”所必然造成的
:由于直接使用“点映射”,因此所得到的像素极可能不是最佳像素,可以想象这个“一
”字,如果“邻插”后映射的点在偶数行,而这个“一”字的一横是在奇数行的话,那么
你可以想象得出后果吗?“啥都没有!”..答案是可能对也可能错,因为有可能还有一点,
就是"宋体"“一”字结尾上的那一点!哈哈哈哈......

 

    OK!假如自己写缩放代码而得出这样的结果,恐怕没人愿意,是的,假如你把boss
给你的扫描黑白档案缩小成这个鬼样而且不可复原,恐怕你的boss马上就把你喀嚓掉,
hoho,这根本就和windows自带的“画图”软件缩放相差了十万八千里(图2):

图2

 

 

    好吧好吧,程序是死的,人是活的,至不济也要搞到至少和画图的效果一样吧,稍微
修改一下后,ok,和“画图”八九不离十了......(图3):

图3

 

 

    是否有点原汁原味(汗)?这可不是基于GDI缩放的(用GDI就不用烦了).最后放上“双插”
的效果图(图4),哪个效果好就见仁见智了,不过偶还是觉得图3好呢。。。至于“关于双插缩放”,下次再说。

 

图4

 

                                                                 BYEBYE~~~

                                                                       BY Lambochan 2009/6/26 12:35分

 

 

 

 

 

 

 

(最后附上未缩小前原图的连接:http://blog.chinaunix.net/photo/45457_090626124109.png)

BTW:能用GDI就用GDI吧,GDI其实也不差的~~自己写实现方法是个极大的考验~good luck~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值