代码之家  ›  专栏  ›  技术社区  ›  George

在点a到b之间线性增加RGB565值

  •  -1
  • George  · 技术社区  · 7 年前

    我想线性增加点a到b之间的RGB值。

    到目前为止,这是我的函数,它得到一个十六进制并将其转换为RGB,但我不确定如何扩展它来完成上述操作。

    void rgb(int hexValue)
    {
        unsigned r = (hexValue & 0xF800) >> 11;
        unsigned g = (hexValue & 0x07E0) >> 5;
        unsigned b = hexValue & 0x001F;
    
        r = (r * 255) / 31;
        g = (g * 255) / 63;
        b = (b * 255) / 31;
    
        printf("r: %d, g: %d, b: %d\n", r, g, b);
    }
    

    非常感谢。

    编辑: 根据我下面的评论,这是一个试图解决这个问题的示例代码。。

    int ra = 0;
    int ga = 0;
    int ba = 0;
    
    int rb = 255;
    int gb = 255;
    int bb = 255;
    
    int r = 0;
    int g = 0;
    int b = 0;
    
    for(int i = 0; i < W; i++)
    {
        r = (ra*((W-1)-i) + rb*i)/(W-1);
        g = (ga*((W-1)-i) + gb*i)/(W-1);
        b = (ga*((W-1)-i) + bb*i)/(W-1);
    
        printf("loop is: %d -- r: %d, g: %d, b: %d\n", i, r, g, b);
    }
    

    这个逻辑正确吗?如果是这样,我需要得到ra,ga,ba并将它们转换回十六进制。

    我的输出是:

    loop is: 0 -- r: 0, g: 0, b: 0
    loop is: 1 -- r: 17, g: 17, b: 17
    loop is: 2 -- r: 34, g: 34, b: 34
    loop is: 3 -- r: 51, g: 51, b: 51
    loop is: 4 -- r: 68, g: 68, b: 68
    loop is: 5 -- r: 85, g: 85, b: 85
    loop is: 6 -- r: 102, g: 102, b: 102
    loop is: 7 -- r: 119, g: 119, b: 119
    loop is: 8 -- r: 136, g: 136, b: 136
    loop is: 9 -- r: 153, g: 153, b: 153
    loop is: 10 -- r: 170, g: 170, b: 170
    loop is: 11 -- r: 187, g: 187, b: 187
    loop is: 12 -- r: 204, g: 204, b: 204
    loop is: 13 -- r: 221, g: 221, b: 221
    loop is: 14 -- r: 238, g: 238, b: 238
    loop is: 15 -- r: 255, g: 255, b: 255
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   geza    7 年前

    这里有一个解决方案:

    void rgb(int rgbA, int rgbB) {
        int ra = (rgbA&0xf800)>>11;
        int ga = (rgbA&0x7e0)>>5;
        int ba = rgbA&0x1f;
        int rb = (rgbB&0xf800)>>11;
        int gb = (rgbB&0x7e0)>>5;
        int bb = rgbB&0x1f;
    
        for (int i=0; i<16; i++) {
            int r = (ra*(15-i) + rb*i + 7)/15; // + 7 is there to apply rounding
            int g = (ga*(15-i) + gb*i + 7)/15;
            int b = (ba*(15-i) + bb*i + 7)/15;
    
            int result = r<<11|g<<5|b;
    
            printf("%04x\n", result);
        }
    }