RGBデータをHSLデータに変換してからRGBデータに戻すための高速アルゴリズム(通常は整数のみを使用)を探しています。これらの変換のアルゴリズム(ウィキペディア)を見つけましたが、フローティング操作が必要なため、高速ではありません。
整数のみを使用する効率的なアルゴリズムを知っている人はいますか?
RGBデータをHSLデータに変換してからRGBデータに戻すための高速アルゴリズム(通常は整数のみを使用)を探しています。これらの変換のアルゴリズム(ウィキペディア)を見つけましたが、フローティング操作が必要なため、高速ではありません。
整数のみを使用する効率的なアルゴリズムを知っている人はいますか?
ほぼ5年経ちますが、答えはありませんか?さて、ここに 50% があります: HSL -> RGB
uint32_t hsl2rgb(uint8_t h, uint8_t s, uint8_t l) {
uint8_t r, g, b, lo, c, x, m;
uint16_t h1, l1, H;
l1 = l + 1;
if (l < 128) {
c = ((l1<<1) * s) >> 8;
}
else {
c = (512 - (l1<<1)) * s >> 8;
}
H = h*6; // 0 to 1535 (actually 1530)
lo = H & 255; // Low byte = primary/secondary color mix
h1 = lo + 1;
if ((H & 256) == 0) { // even sextant, like red to yellow
x = h1 * c >> 8;
}
else { // odd sextant, like yellow to green
x = (256 - h1) * c >> 8;
}
m = l - (c >> 1);
switch(H >> 8) { // High byte = sextant of colorwheel
case 0 : r = c ; g = x ; b = 0 ; break; // R to Y
case 1 : r = x ; g = c ; b = 0 ; break; // Y to G
case 2 : r = 0 ; g = c ; b = x ; break; // G to C
case 3 : r = 0 ; g = x ; b = c ; break; // C to B
case 4 : r = x ; g = 0 ; b = c ; break; // B to M
default: r = c ; g = 0 ; b = x ; break; // M to R
}
return r+m<<16 | g+m<<8 | b+m;
}