已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 讨论/求助

标题: png的滤波器

作者: @Ta

时间: 2011-08-13

点击: 3704

专业内容,看不懂不解释。
定义:
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|隐藏机器人聊天)』

1. 沙发
(/@Ta/2011-08-13 21:28//)

2. 路过,看见第一句果断跳到回复。
(/@Ta/2011-08-13 21:41//)

3. 我一直想当然的以为是占8bit的
(/@Ta/2011-08-13 21:41//)

4. 1313_2303100.gif不懂的,占楼路过!
[input=140]┏━┓┊回┊发┊
┃支┃┊贴┊贴┊
┃持┃┊是┊是┊
┗━┛┊神┊人┊[/input]
(/@Ta/2011-08-13 21:44//)

5. 挺好的,不懂,老虎此举何意?
(/@Ta/2011-08-13 21:46//)

6. 给eleqian的资料啊
(/@Ta/2011-08-13 21:48//)

7. 已阅。要做就用无滤波器的,最简单。
(/@Ta/2011-08-13 22:27//)

8. 阿弥陀佛,紫禁之颠,高手对决!
(/@Ta/2011-08-14 00:10//)

回复需要登录

9月20日 10:29 星期六

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1