2024年4月6日发(作者:)

图像缩放算法

摘要:首先给出一个基本的图像缩放算法,然后一步一步的优化其速度和缩放质量;

高质量的快速的图像缩放 全文 分为:

上篇 近邻取样插值和其速度优化

中篇 二次线性插值和三次卷积插值

下篇 三次线性插值和MipMap链

正文:

为了便于讨论,这里只处理32bit的ARGB颜色;

代码使用C++;涉及到汇编优化的时候假定为x86平台;使用的编译器为vc2005;

为了代码的可读性,没有加入异常处理代码;

测试使用的CPU为AMD64x2 4200+(2.37G) 和 Intel Core2 4400(2.00G);

速度测试说明:

只测试内存数据到内存数据的缩放

测试图片都是800*600缩放到1024*768; fps表示每秒钟的帧数,值越大表示函数越快

////////////////////////////////////////////////////////////////////////

////////

//Windows GDI相关函数参考速度:

//======================================================================

========

// BitBlt 544.7 fps //is copy 800*600 to 800*600

// BitBlt 331.6 fps //is copy 1024*1024 to 1024*1024

// StretchBlt 232.7 fps //is zoom 800*600 to 1024*1024

////////////////////////////////////////////////////////////////////////

////////

A: 首先定义图像数据结构:

#define asm __asm

typedef unsigned char TUInt8; // [0..255]

struct TARGB32 //32 bit color

{

TUInt8 B,G,R,A; // A is alpha

};

struct TPicRegion //一块颜色数据区的描述,便于参数传递

{

TARGB32* pdata; //颜色数据首地址

long byte_width; //一行数据的物理宽度(字节宽度);

//abs(byte_width)有可能大于等于width*sizeof(TARGB32);

long width; //像素宽度

long height; //像素高度

};

//那么访问一个点的函数可以写为:

inline TARGB32& Pixels(const TPicRegion& pic,const long x,const long y)

{

return ( (TARGB32*)((TUInt8*)+_width*y) )[x];

}

B: 缩放原理和公式图示:

缩放后图片 原图片

(宽DW,高DH) (宽SW,高SH)