标签:pixman 视频编码 图形 算法
pixman作为一个独立的第三方绘图库,其主要作用是根据操作模式及相应的数学算法对图形进行二次处理。常见的有Gradient(颜色渐变)、ROP(光栅操作)、矢量图操作、Alpha compositing、线性变换等。我们涉及的有基本的ROP操作(主要是像素的位运算)、Alpha compositing以及缩放用到的线性变换等。下图是Alpha
compositing的效果图:
这里的Alpha compositing满足如下描述:
opaque采取:
over:SRC独占取SRC,DST独占取DST,重叠部分视具体操作而定
src-over:SRC独占取SRC,DST独占取DST,重叠部分取SRC
dst-over:SRC独占取SRC,DST独占取DST,重叠部分取DST
in:只取交集部分
src-in :取交集的SRC
dst-in :取交集的DST
out:只取DST or SRC的区域,并且重叠部分去掉
src-out :只取SRC区域,并去掉交集部分
dst-out :只取DST区域,并去掉交集部分
atop:只取DST or SRC的区域,而交集部分取对方
src-atop:取DST区域,但交集部分取SRC
dst-atop:取SRC区域,但交集部分取DST
xor:顾名思义,即全取SRC and DST,去掉其交集部分
(图中可以很清楚的看到这些)
Partially Transparent类似opaque,只不过多引入了Alpha
Src :SRC的色值
Dst :DST的色值
Sa :SRC的Alpha值,一般是(0~255),这里便于理解视作(0~1)
Da :DST的Alpha值,一般是(0~255),这里便于理解视作(0~1)
SRC独占,则有: Src * (1 - Da)
DST独占,则有: Dst * (1 - Sa)
重叠部分,取SRC,则有: Src * Da
重叠部分,取DST,则有: Dst * Sa
以src-over为例,则最终该点像素值为:
Src * (1 - Da) + Src * Da + Dst * (1 - Sa)
=Src + Dst * (1 - Sa)
一般该点像素值满足公式: Color = Src * As + Dst * Ad
(As和Ad分别为Src跟Dst在该点的权重系数)
线性变换:
采用3 x 3矩阵对图像进行线性缩放。
pixman_transform_init_scale()初始化一个3 x 3矩阵,用于缩放
pixman_transform_translate()涉及两个矩阵,一个是pixman_transform_init_scale()获得的缩放倍数的矩阵,另一个用于操作Z轴,达到平移的目的。这两个矩阵平移矩阵作为左项,缩放矩阵作为右项。
现以像素点(10,10)为例,现在要将其按适量(4,5)进行平移,并进行放大两倍的操作,则有:
而填充的像素采用线性插值法,即初始点跟终点确定一条直线y = kx,可以得知其斜率,则可以根据这条直线在初始点跟终点之间插入数值,例如:
x1 = 10, y1 = 10; x2 = 10, y2 = 20;之间插入4个点
则(x1, y1)与(x2, y2)确定一条直线 x = 10,则有这4个点:
(10,12), (10,14), (10,16), (10,18)
当两个像素之间线性插值的时候,还以4个(红色部分)为例,在 0 到 10插入,则有:
0 2 4 6 8 10
pixman ROP/alpha blend 线性变换
标签:pixman 视频编码 图形 算法
原文地址:http://blog.csdn.net/lidecoolblue/article/details/43701453