我有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
是混合颜色,^
是按位AND,>>
是按位移位是的,<<
向左移位,xxxxxxxxB
是二进制数,avg( a , b )
是算术平均值。
答案 0 :(得分:2)
您可以将颜色视为3D空间中的点。 “平均”的定义取决于您使用的空间。如果你平均RGB,HSL或更具“异国情调”的东西,你会得到不同的结果。
但是,如果你的每种颜色限制为2比特,那么这一切都不会真正重要,你的建议很好(除非,如评论中所述,你需要&
,而不是{ {1}},掩盖)。
(通过“平均”我假设你的意思是添加位(每种颜色)并除以2(右移)。注意,如果你重复这样做(例如平均两个图像,然后用第三个平均结果,那么用第四个算法得到结果然后你最终会得到一些黑色的东西,因为右移向下舍入,所以你略微偏向于较低的值。)