두 가지 색상을 평균화하려고합니다.두 개의 32 비트 색상을 평균으로 정수로 채우시겠습니까?
내 원래 (끔찍한)를 구현 다음과 같습니다 (이 약의 그러나
int ColorAverage(int c1, int c2) {
unsigned char* b1 = reinterpret_cast<unsigned char*>(&c1);
unsigned char* b2 = reinterpret_cast<unsigned char*>(&c2);
int value;
unsigned char* bv = reinterpret_cast<unsigned char*>(&value);
bv[0] = (b1[0] + b2[0])/2;
bv[1] = (b1[1] + b2[1])/2;
bv[2] = (b1[2] + b2[2])/2;
bv[3] = (b1[3] + b2[3])/2;
return(value);
}
, 그것은 여전히 매우 느린 다음과 같이
//color is a union
int ColorAverage(int c1, int c2) {
color C1(c1);
color C2(c2);
return color(
(unsigned char)(0.5f * C1.a + 0.5f * C2.a),
(unsigned char)(0.5f * C1.r + 0.5f * C2.r),
(unsigned char)(0.5f * C1.g + 0.5f * C2.g),
(unsigned char)(0.5f * C1.b + 0.5f * C2.b)
).c;
}
나의 현재 솔루션 (이 상당히 잘 수행)입니다 내 프레임 시간의 3 %).
나는 24 비트에 대한 해결책을 발견했다, 그러나 그것은 (알파가 손실) 32 비트에 적용되지 않습니다
#define AVERAGE(a, b) (((((a)^(b)) & 0xfffefefeL) >> 1) + ((a) & (b)))
http://www.compuphase.com/graphic/scale3.htm#HSIEH1