RGB格式学习:RGBx、xRGB、RGBA、ARGB等格式转换成RGB

在使用gstreamer的过程中经常遇到各种类型的RGB格式图像。来看看各种格式有什么关系。RGB类型格式在内存中各个分量都是依次排序的。排序方式都是和命名方式的位置顺序是一致的,且各个分量都是占一个字节的大小。下面列出RGB的详细信息。

  • "RGB"

    +--+--+--+ +--+--+--+
    |R0|G0|B0| |R1|G1|B1| ...
    +--+--+--+ +--+--+--+
     Component 0: R
       depth:           8
       pstride:         3
       offset:          0
    
     Component 1: G
       depth:           8
       pstride:         3
       offset:          1
    
     Component 2: B
       depth            8
       pstride:         3
       offset:          2
    
     Image
       default rstride: RU4 (width * 3)
       default size:    rstride (image) * height
    
  • "BGR" 则是反向RGB

    +--+--+--+ +--+--+--+
    |B0|G0|R0| |B1|G1|R1| ...
    +--+--+--+ +--+--+--+
    

而RGBx和RGBA只是在RGB的形式上多了一个通道而已。A代表Alpha通道,主要用来表示图像叠加时的透明度选择。x代表在RGB基础增加一个通道用来存储其他信息。这两个分量在内存上都是比RGB多占用一个字节。

  • "BGRA" 带有 Alpha 通道的 RGB

    +--+--+--+--+ +--+--+--+--+
    |B0|G0|R0|A0| |B1|G1|R1|A1| ...
    +--+--+--+--+ +--+--+--+--+
    
  • "RGBx" sparse RGB packed into 32 bit, space last

    +--+--+--+--+ +--+--+--+--+
    |R0|G0|B0|X | |R1|G1|B1|X | ...
    +--+--+--+--+ +--+--+--+--+
    

其他的ARGB或者BGRx格式都是大同小异,只是各分量排序方式不一样。

弄清楚了内存排序方式就很好实现转换格式了。下面给出GBRx转GBR示例代码。

void cvtColorGBRx2GBR(guint8 *rgb, const guint8 *src, int width, int height)
{
    for (int h = 0; h < height; h++)
    {
        for (int w = 0, w1 = 0; w < width*3; w += 3, w1 += 4)
        {
            rgb[w]     = src[w1];
            rgb[w + 1] = src[w1+1];
            rgb[w + 2] = src[w1+2];
        }
        rgb += width*3;
        src += width*4;
    }
    return;
}

转RGB的话只需要改变分量的位置就行了

        rgb[w]     = src[w1+2];
        rgb[w + 1] = src[w1+1];
        rgb[w + 2] = src[w1];

总体来说其实就是x或者A通道分量去掉重新组合成RGB。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

此心安处是吾鄕

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值