png的滤波器
专业内容,看不懂不解释。
定义:
BPP:每像素所占的字节数,8位真彩色的BPP是3
扫描行:每个扫描行的大小是 图片宽度*BPP+1,因为每个扫描行的第一字节记录了该行的滤波器类型,它们的值从0x00到0x04
0x00,无滤波器,直接返回原始值
0x01,差值滤波(Sub filter)
R=Sub(X)+Raw(X-BPP)
其中,R表示红色分量,SUB(X)代表滤波后的值(从解码后的内容中读出的值),RAW(X-BPP)表示它前面一个像素的红色分量(解码后的值)。
如果X-BPP<0,则认为RAW(X-BPP)的值为0
紧接着的绿色分量和蓝色分量也用同样的方法解码,每次X+1
0x02,Up filter
R=Up(X)+Prior(X)
其中Up(X)是当前位置的编码值,Prior(X)是上一扫描行同一位置解码后的值。如果X=0,则认为Prior(X)为0
0x03,Averae,平均值滤波
R=Averae(X)+floor((Raw(X-BPP)+Prior(X))/2)
其中Raw和Prior同上面两个。floor表示舍去小数部分(整数除法)
Average(X)表示当前编码值
0x04,Paeth算法滤波
R=Paeth(X)+PaethPredictor( Raw(X-BPP), Prior(X), Prior(X-BPP) )
其中函数的三个参数分别表示当前位置的左边、上方和左上角,超出边界则值取0。
函数定义如下:
无符号char PaethPredictor(无符号char a, 无符号char b, 无符号char c)
{
int pa,pb,pc;
pa=abs(b-c);
pb=abs(a-c);
pc=abs(a+b-c-c);
//abs表示取绝对值
if(pa<=pb && pa<=pc)
return a;
else if(pb<=pc)
return b;
else
return c;
}
[input=140]┏━┓┊回┊发┊
┃支┃┊贴┊贴┊
┃持┃┊是┊是┊
┗━┛┊神┊人┊[/input]