本人用VC++语言实现了图像缩放的程序,算法是自己写的,类似三次立方插值的方法,计算量也不大,在计算一个点大概需要用几次整型加法,乘法,很几次函数调用(自己写的函数),但遇到一个很大困惑,就是运行速度很慢(估计有60-100倍,统计是在放大1600x1200 水平竖直各四倍)与Photoshop或类似的图片处理软件相比. 本人对C++相当了解,但基于windows编程不是很熟悉,想请问有高手知道类似的windows图像处理软件是怎么做scaler的吗?用什么编成方法与思路?
补充:1维缩放算法就算算法再优秀,也需要做逐个点的插值计算,以1600x1200为例子,循环至少需要1600x1200个,如果要调用程序里的函数的话就会很慢,哪怕你的函数再简单,这就是我想问的是有什么基于windows的编成方法我不知
我在MFC里做了一个测试,如果仅只调用一个系统涵数floor() 在2000x2000x5的循环里已经是非常的慢的,我觉得这个速度已经与photoshop全部处理的时间差不多了.
注释:2000x2000是图像的resolution.
补充:1维缩放算法就算算法再优秀,也需要做逐个点的插值计算,以1600x1200为例子,循环至少需要1600x1200个,如果要调用程序里的函数的话就会很慢,哪怕你的函数再简单,这就是我想问的是有什么基于windows的编成方法我不知
我在MFC里做了一个测试,如果仅只调用一个系统涵数floor() 在2000x2000x5的循环里已经是非常的慢的,我觉得这个速度已经与photoshop全部处理的时间差不多了.
注释:2000x2000是图像的resolution.
我是采用GDI+中的Bitmap类和Graph来处理放缩的,可以设置插值模式,感觉处理大图片速度可以。自己实现起来可能是汇编会速度快点,WIndows下对点操作是最影响速度的。
其实有很多路
1.MMX,SSE
2.GDI+
3.图像处理库
...
有三篇关于快速缩放 和 高质量和缩放的
《图形图像处理-之-高质量的快速的图像缩放 上篇 近邻取样插值和其速度优化》
《图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值》
《图形图像处理-之-高质量的快速的图像缩放 下篇 三次线性插值和MipMap链》比如其中近邻取样缩放函数可以到上千帧
//CPU: Intel Core2 4400(2.00G) zoom 800*600 to 1024*768
//PicZoom3_SSE 1099.7 fps
你可以看看我的blog中的《代码优化-之-优化浮点数取整》文章,对取整的速度优化作了多方面的尝试
2. 如果要自己处理像素, 可以这样减少处理:
a. 像一楼说的, 如果放大, 只考虑要显示的像素;
b. 如果缩小, 只要循环缩小以后的像素次, 比如从1600x1200缩小到800x600, 那么:
for(register int i=0; i<800; i++)
for(register int j=0; j<600; j++)
{
pData[i][j] = ....
}