を理解されたいです。すなわち、最初に、色(最も適切な点で各色軸を分割することによって簡単に行うことができる)の最も近いRGB0およびRGB1近似を見つけ、これらの近似のどちらが良いかを決定する。
// find the closest RGBx approximation of a 24-bit RGB color, for x = 0 or 1
function rgbx_approx(red, green, blue, x) {
threshold = (x + 1) * 255/3;
r = (red > threshold ? 1 : 0);
g = (green > threshold ? 1 : 0);
b = (blue > threshold ? 1 : 0);
return (r, g, b);
}
// convert a 4-bit RGBI color back to 24-bit RGB
function rgbi_to_rgb24(r, g, b, i) {
red = (2*r + i) * 255/3;
green = (2*g + i) * 255/3;
blue = (2*b + i) * 255/3;
return (red, green, blue);
}
// return the (squared) Euclidean distance between two RGB colors
function color_distance(red_a, green_a, blue_a, red_b, green_b, blue_b) {
d_red = red_a - red_b;
d_green = green_a - green_b;
d_blue = blue_a - blue_b;
return (d_red * d_red) + (d_green * d_green) + (d_blue * d_blue);
}
// find the closest 4-bit RGBI approximation (by Euclidean distance) to a 24-bit RGB color
function rgbi_approx(red, green, blue) {
// find best RGB0 and RGB1 approximations:
(r0, g0, b0) = rgbx_approx(red, green, blue, 0);
(r1, g1, b1) = rgbx_approx(red, green, blue, 1);
// convert them back to 24-bit RGB:
(red0, green0, blue0) = rgbi_to_rgb24(r0, g0, b0, 0);
(red1, green1, blue1) = rgbi_to_rgb24(r1, g1, b1, 1);
// return the color closer to the original:
d0 = color_distance(red, green, blue, red0, green0, blue0);
d1 = color_distance(red, green, blue, red1, green1, blue1);
if (d0 <= d1) return (r0, g0, b0, 0);
else return (r1, g1, b1, 1);
}
また、あなたは、単に任意の一般的な固定パレットカラー量子化アルゴリズムを使用することができます。
は、ここでは、このアルゴリズムの簡単なCっぽい擬似コードの説明です。上記のコードのように、実際のカラーパレットが純粋に等間隔のRGBIパレットではなく、むしろ、 CGA tweaked RGBI palette。
各24ビットカラーを最も近い4ビットに変換したいのですか、実際にはカラーディザリングをしたいのですか? –
@IlmariKaronenから最も近い同等物 –