【问题标题】:How to convert from RGB555 to RGB888 in c#?如何在 C# 中将 RGB555 转换为 RGB888?
【发布时间】:2010-12-12 23:33:38
【问题描述】:

我需要将 16 位 XRGB1555 转换为 24 位 RGB888。我的函数如下,但它并不完美,即 0b11111 的值将给出 248 作为像素值,而不是 255。此函数适用于小端,但可以轻松修改为大端。

public static Color XRGB1555(byte b0, byte b1)
{ 
    return Color.FromArgb(0xFF, (b1 & 0x7C) << 1, ((b1 & 0x03) << 6) | ((b0 & 0xE0) >> 2), (b0 & 0x1F) << 3); 
}

任何想法如何使它工作?

【问题讨论】:

    标签: c# rgb


    【解决方案1】:

    您通常会将最高位复制到最低位,因此如果您有五个位,如下所示:

    Bit position: 4 3 2 1 0
    Bit variable: A B C D E
    

    您可以将其扩展到八位:

    Bit position: 7 6 5 4 3 2 1 0
    Bit variable: A B C D E A B C
    

    这样,全零仍然全零,全一变为全一,并且介于两者之间的值适当地缩放。

    (请注意,A、B、C 等不应该是十六进制数字 - 它们是代表单个位的变量)。

    【讨论】:

    • 所以如果 x 是我当前函数的结果,我想要 x|(x>>5)
    • 是的,假设您的值在位 7-3 中是正确的,或者如@CodeInChaos 指定的那样,如果您在位 4-0 中有它,那么它是 (x> 2).
    【解决方案2】:

    我会使用查找表。由于只有 32 个不同的值,它甚至可以放入缓存行中。

    您可以通过以下方式从 5 位值中获取 8 位值: return (x&lt;&lt;3)||(x&gt;&gt;2);

    虽然四舍五入可能并不完美。 IE。结果并不总是最接近输入,但它永远不会比 1/255 更远。

    【讨论】:

    • 重新四舍五入,对于 3/31 和 7/31 来说,你的 1/255 太低了,而对于 24/31 和 28/31 来说,1/255 太高了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多