本人用VC++语言实现了图像缩放的程序,算法是自己写的,类似三次立方插值的方法,计算量也不大,在计算一个点大概需要用几次整型加法,乘法,很几次函数调用(自己写的函数),但遇到一个很大困惑,就是运行速度很慢(估计有60-100倍,统计是在放大1600x1200 水平竖直各四倍)与Photoshop或类似的图片处理软件相比. 本人对C++相当了解,但基于windows编程不是很熟悉,想请问有高手知道类似的windows图像处理软件是怎么做scaler的吗?用什么编成方法与思路? 
补充:1维缩放算法就算算法再优秀,也需要做逐个点的插值计算,以1600x1200为例子,循环至少需要1600x1200个,如果要调用程序里的函数的话就会很慢,哪怕你的函数再简单,这就是我想问的是有什么基于windows的编成方法我不知
我在MFC里做了一个测试,如果仅只调用一个系统涵数floor() 在2000x2000x5的循环里已经是非常的慢的,我觉得这个速度已经与photoshop全部处理的时间差不多了. 
注释:2000x2000是图像的resolution.

解决方案 »

  1.   

    您是在练习写放缩算法还是想在Windows下快速实现放缩?
    我是采用GDI+中的Bitmap类和Graph来处理放缩的,可以设置插值模式,感觉处理大图片速度可以。自己实现起来可能是汇编会速度快点,WIndows下对点操作是最影响速度的。
      

  2.   

    我在练习在windows下快速实现,但即使汇编速度提升应该也最多就100%吧,我现在觉得速度差了有2个数量级
      

  3.   


    其实有很多路
    1.MMX,SSE
    2.GDI+
    3.图像处理库
    ...
      

  4.   

    我可以调用GDI+里面现成的函数,但这样一来的话,放大后的质量就比不上photoshop了,因为microsoft对于filter设计并不投入
      

  5.   

    GDI+里面有多种插值模式,你可以看看参数选择,我的图像放大后和PhotoShop对比过,没看出差异,你是如何比较出差异的?
      

  6.   

    你去看看我的blog: http://blog.csdn.net/housisong
    有三篇关于快速缩放 和 高质量和缩放的
      《图形图像处理-之-高质量的快速的图像缩放 上篇 近邻取样插值和其速度优化》
      《图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值》
      《图形图像处理-之-高质量的快速的图像缩放 下篇 三次线性插值和MipMap链》比如其中近邻取样缩放函数可以到上千帧
    //CPU: Intel Core2 4400(2.00G)  zoom 800*600 to 1024*768
    //PicZoom3_SSE      1099.7 fps   
      

  7.   

    "我在MFC里做了一个测试,如果仅只调用一个系统涵数floor()   在2000x2000x5的循环里已经是非常的慢的,我觉得这个速度已经与photoshop全部处理的时间差不多了. "编译器默认的floor之类的取整操作,是很慢的一类操作,
    你可以看看我的blog中的《代码优化-之-优化浮点数取整》文章,对取整的速度优化作了多方面的尝试
      

  8.   

    gdi+里面可以设置插值算法的,默认的那个似乎效果就是不好,多换几种试试
      

  9.   

    用MFC自带的StretchBlt()不就可以了,先把图像放在内存中,再用stretchBlt()放大或缩小
      

  10.   

    1. 可以用StretchBlt或StretchDIBits吗?
    2. 如果要自己处理像素, 可以这样减少处理:
      a. 像一楼说的, 如果放大, 只考虑要显示的像素;
      b. 如果缩小, 只要循环缩小以后的像素次, 比如从1600x1200缩小到800x600, 那么:
         for(register int i=0; i<800; i++)
         for(register int j=0; j<600; j++)
         {
            pData[i][j] = ....
         }