在YUV帧图像上使用指定颜色画一个矩形

李国帅 写于2010


YUV_drawRect(pBuffer, VideoWidth, VideoHeight, lPitch, 100, 100, 200, 200, RGB(255, 0, 0));
void YUV_drawRect(unsigned char *dst_buf, int w, int h, int lpitch, int x0, int y0, int x1, int y1, unsigned long rgba)
{
    unsigned char r, g, b, y, cb, cr;
    b = (rgba >> 8) & 0xFF;
    g = (rgba >> 16) & 0xFF;
    r = (rgba >> 24) & 0xFF;
    y = 16 + 0.257*r + 0.504*g + 0.098*b;
    cb = 128 - 0.148*r - 0.291*g + 0.439*b;
    cr = 128 + 0.439*r - 0.368*g - 0.071*b;

    int rect_width, rect_height;
    x0 = x0 & 0xFFFE;
    y0 = y0 & 0xFFFE;
    x1 = x1 & 0xFFFE;
    y1 = y1 & 0xFFFE;
    rect_width = x1 - x0;
    rect_height = y1 - y0;

    unsigned char *xoff;
    unsigned char *yoff;
    xoff = dst_buf + y0*lpitch + x0;
    memset(xoff, y, rect_width);//rowline
    xoff = dst_buf + (y0 + 1)*lpitch + x0;
    memset(xoff, y, rect_width);

    xoff = dst_buf + (y1 - 1)*lpitch + x0;
    memset(xoff, y, rect_width);//colline
    xoff = dst_buf + y1*lpitch + x0;
    memset(xoff, y, rect_width);

    //y first
    for (int i = 0; i < rect_height; i++)
    {
        yoff = dst_buf + (i + y0)*lpitch + x0;
        *yoff = y;
        yoff = dst_buf + (i + y0)*lpitch + x0 + 1;
        *yoff = y;

        yoff = dst_buf + (i + y0)*lpitch + x1 - 1;
        *yoff = y;
        yoff = dst_buf + (i + y0)*lpitch + x1;
        *yoff = y;
    }

    //cb next
    xoff = dst_buf + lpitch * h + y0*lpitch / 4 + x0 / 2;
    memset(xoff, cb, rect_width / 2);

    xoff = dst_buf + lpitch * h + y1*lpitch / 4 + x0 / 2;
    memset(xoff, cb, rect_width / 2);

    for (int i = 0; i < rect_height; i += 2)
    {
        yoff = dst_buf + lpitch * h + (i + y0)*lpitch / 4 + x0 / 2;
        *yoff = cb;

        yoff = dst_buf + lpitch * h + (i + y0)*lpitch / 4 + x1 / 2;
        *yoff = cb;
    }

    //cr last
    xoff = dst_buf + lpitch * h + lpitch * h / 4 + y0*lpitch / 4 + x0 / 2;
    memset(xoff, cr, rect_width / 2);

    xoff = dst_buf + lpitch * h + lpitch * h / 4 + y1*lpitch / 4 + x0 / 2;
    memset(xoff, cr, rect_width / 2);

    for (int i = 0; i < rect_height; i += 2)
    {
        yoff = dst_buf + lpitch * h + lpitch * h / 4 + (i + y0)*lpitch / 4 + x0 / 2;
        *yoff = cr;

        yoff = dst_buf + lpitch * h + lpitch * h / 4 + (i + y0)*lpitch / 4 + x1 / 2;
        *yoff = cr;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值