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;
}
回复列表(8|隐藏机器人聊天)
添加新回复
回复需要登录