2017-01-13 9 views
1

24ビットカラーを4ビットRGBI(赤、緑、青+輝度の場合は1ビット)に変換する必要があります。24ビットカラーを4ビットRGBIに変換する

3ビットRGBに変換するのは簡単です。127より大きい場合はカラービットを設定し、それ以外の場合はクリアします。しかし、3つのチャンネルすべてに1つの強度ビットしかありません。そのため、設定する正しい方法は何ですか?

まずIは以下のような三つの部分に8ビットのチャネルを分割考えた:

  • 色< = < 86であれば0 < =カラー< = 85、次いで透明RGBI色ビット
  • 場合= 170、色< = 255、次いでRGBI色ビットと強度
を設定= < 171ならば、
  • RGBIカラービットをセット10

    しかし、私はおそらく正しい方法は、3つのチャンネルのうちの2つが127より大きい場合にのみ強度ビットを設定することだと考えました。しかしその場合、純粋なR、G、またはBは強度が設定されません(例えばRBGの場合(0,0,200)

    は、任意のアドバイスは非常に色の最も近い4-bit RGBI近似を見つけるための簡単な方法は、別々に強度ビットのための2つの可能性を考慮することである

  • +0

    各24ビットカラーを最も近い4ビットに変換したいのですか、実際にはカラーディザリングをしたいのですか? –

    +0

    @IlmariKaronenから最も近い同等物 –

    答えて

    1

    を理解されたいです。すなわち、最初に、色(最も適切な点で各色軸を分割することによって簡単に行うことができる)の最も近い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

    関連する問題