4

我有 2 个字节以 8 位格式表示颜色

MSB  LSB
01234567
  RRGGBB

位 0 和 1 是垃圾。

要混合两种颜色,我应该只平均每种颜色的位数吗?

R1 = ( C1 ^ 00110000B ) >> 4;
G1 = ( C1 ^ 00001100B ) >> 2;
B1 = ( C1 ^ 00000011B );

R2 = ( C2 ^ 00110000B ) >> 4;
G2 = ( C2 ^ 00001100B ) >> 2;
B2 = ( C2 ^ 00000011B );

R3 = avg( R1 , R2 ) << 4;
G3 = avg( G1 , G2 ) << 2;
B3 = avg( B1 , B2 );

C3 = R3 + G3 + B3

其中C1是第一种颜色,C2是第二种颜色,是C3混合颜色,^是按位与,>>是按位右移,<<是按位左移,xxxxxxxxB是二进制数,avg( a , b )是算术平均值。

4

1 回答 1

2

您可以认为颜色是 3D 空间中的点。“平均”的定义取决于您使用的空间。如果您平均 RGB、HSL 或更“异国情调”的东西,您将得到不同的结果。

但是,如果您将每种颜色限制为 2 位,那么这些都不会真正重要,并且您的建议很好(除非,如评论中所述,您需要&,而不是^,来掩盖)。

(通过“平均”,我假设您的意思是添加位(每种颜色)并除以 2(右移)。请注意,如果您重复执行此操作(例如,平均两个图像,然后将结果与第三个平均,然后平均结果其中第四个)然后你最终会得到一些黑色的东西,因为右移向下舍入,所以你稍微偏向于较低的值)。

于 2012-07-12T00:21:35.123 回答