图形图像处理-之-高质量的快速的图像缩放 补充 使用SSE2优化
HouSisong@GMail.com 2011.04.12
tag: 图像缩放,速度优化,线性插值,三次卷积插值,SSE2,scale,bilinear,bicubic,StretchBlt
摘要:
本文章对线性插值和三次卷积插值(bicubic)的实现做了一些新的优化尝试;
使用了SSE2的128bit寄存器及相关指令;并预先建立SSE2用到的缩放系数表;
实现的结果在我的i7电脑上比以前的版本分别快出145%和75%!
线性插值的速度是StretchBlt的13倍!
正文:
(请先看看我的blog里<高质量的快速的图像缩放>的前3篇文章!)
支持SSE2指令集的CPU越来越多,CPU的SSE2实现性能也好了很多(以前不比MMX好多少),
而且软件在64位模式的时候不再支持MMX,所以尝试了SSE2的缩放优化,效果不错!
速度测试说明:
只测试内存数据到内存数据的缩放
测试图片都是800*600缩放到1024*768,单线程;fps表示每秒钟的帧数,值越大表示函数越快.
速度测试对比: (CPU:i7 920 内存:DDR3 1333 3通道)
(windows)
StretchBlt 近邻取样 869.09 fps
StretchBlt 线性插值 44.46 fps //SetStretchBltMode(dc,4);?
PicZoom0: 95.69 fps
PicZoom1: 158.35 fps
PicZoom2: 332.78 fps
PicZoom3: 1172.79 fps
PicZoom3_float: 874.13 fps
PicZoom3_Table: 1158.30 fps
PicZoom3_SSE: 1908.40 fps
PicZoom_Bilinear0: 28.80 fps
PicZoom_Bilinear1: 56.09 fps
PicZoom_Bilinear2: 97.09 fps
PicZoom_Bilinear_Common: 119.83 fps
PicZoom_Bilinear_MMX: 180.12 fps
PicZoom_Bilinear_MMX_Ex: 237.34 fps
PicZoom_ftBilinear_Common: 118.67 fps
PicZoom_ftBilinear_MMX: 213.68 fps
PicZoom_ThreeOrder0: 6.11 fps
PicZoom_ThreeOrder_Common: 25.38 fps
PicZoom_ThreeOrder_MMX: 52.32 fps
(SSE2的实现)
PicZoom_ftBilinearTable_SSE2: 588.24 fps
PicZoom_ThreeOrderTable_SSE2: 93.24 fps
PicZoom_ftBilinearTable_SSE2实现代码如下:
PicZoom_ThreeOrderTable_SSE2实现代码如下: