目的
1 为了合并解码后得yuv和透明度 2 为了合并编码前得yuv和透明度
code
注意看一下几个参数,其中alpha为透明度。将d2 合并到d1 上,并且取透明度 读者可以自己理解一下几个参数,并不复杂,透明其实就是公式 a * x + b *(1-x)
其中a,b为像素, x 为小于1 的权重值
#pragma once
#include <stdint.h>
static void MergeYUV(uint8_t * d1, uint16_t d1w, uint16_t d1h, uint8_t * d2, uint16_t d2w, uint16_t d2h, float alpha, uint16_t offsetx, uint16_t offsety)
{
int d1wh = d1w*d1h;
int d2wh = d2w*d2h;
int wh1 = d1wh + d1wh / 4;
int wh2 = d2wh + d2wh / 4;
int i, j, offsetY = 0, offsetUV = 0;
if ((offsetx + d2w <= d1w) && (offsety + d2h <= d1h))
{
offsetY = offsetx + offsety*d1w;
offsetUV = offsetx / 2 + offsety*d1w / 4;
}
if ((alpha > 1) || (alpha < 0))
alpha = 1.0;
for (i = 0; i < d2h; i++)
{
for (j = 0; j < d2w; j++)
{
int c1 = d1[offsetY + i * d1w + j];
int c2 = d2[i * d2w + j];
int cl = (int)(c1*(1.0 - alpha) + c2*alpha);
d1[offsetY + i * d1w + j] = cl;
if ((i<d2h / 2) && (j<d2w / 2))
{
int u1 = d1[offsetUV + d1wh + i*d1w / 2 + j];
int u2 = d2[d2wh + i*d2w / 2 + j];
int u3 = (int)(u1*(1.0 - alpha) + u2*alpha);
int v1 = d1[offsetUV + wh1 + i*d1w / 2 + j];
int v2 = d2[wh2 + i*d2w / 2 + j];
int v3 = (int)(v1*(1.0 - alpha) + v2*alpha);
d1[offsetUV + d1wh + i*d1w / 2 + j] = u3;
d1[offsetUV + wh1 + i*d1w / 2 + j] = v3;
}
}
}
}
这样合并yuv的目的是,假定有两个图像,可以合并后编码,则可以使用这个算法,虽然rgb 合并更方便,但yuv数据量更小,这是它的优点。
|