0

Bitmap特定の色を別の色に置き換えて、それを実行したい状況があります。私の当初の計画は、 a を渡してからDictionary<Color, Color>、現在の色が辞書/マップにあるかどうかを確認してすべてのピクセルをループし、必要に応じて置き換えることでした。

ただし、元の画像にアルファがある場合は、そのアルファを保持したいと考えています。アルファ成分を無視して、色が辞書にあるかどうかを確認する最良の方法に戸惑っています。

私がこれまでに思いついた方法は、新しいクラスなどを作成し、辞書RGBOnlyColorの代わりにそれを使用し、取得した色を検索する前にこれに変換することです。これは非常にやり過ぎのように思えるので、簡単にするために見逃したものがあるかどうか疑問に思っていました...ColorGetPixel

もう1つのオプションは、辞書の単純な拡張であるColorMapクラスを作成することです。これは、設定および取得時にアルファを既知の値に強制して、それが無関係であることを確認するだけです...

では、これを行う最善の方法を教えてくれる人はいますか? 要約すると、アルファ部分をそのままにして画像の色を交換したいのですが、見た目よりも難しいです... :)

4

2 に答える 2

2

アルファの比較を除いて、色を比較するには、これ以上は必要ありません。

bool RGBequal(Color c1, Color c2)
{
    return c1.R==c2.R && c1.G==c2.G && c1.B==c2.B;
}

辞書ベースのアプローチを実装するには、を使用して、アルファ値が255の色を辞書に入力しますColor.FromArgb(r, g, b)。おそらく、拡張メソッドを使用します。

Color Opaque(this Color color)
{
    return Color.FromArgb(color.R, color.G, color.B);
}

ある色のアルファチャネルと別の色のRGBを組み合わせた新しい色を作成するのは簡単です。

Color.FromArgb(color1.A, color2.R, color2.G, color2.B);
于 2012-05-22T09:45:59.787 に答える
2

簡単な方法は、辞書で調べる前に各色のアルファ チャネルをゼロにしてから、マッピングされた色が解決された後に正しいアルファ値を挿入することです。

例:

Color colorFromBitmap; // assume already have this
var colorToLookup = Color.FromArgb(0, colorFromBitmap);
var mappedColor = dictionary[colorToLookup];
var finalResult = Color.FromArgb(colorFromBitmap.A, mappedColor);

色がディクショナリで検索される前にアルファが設定されるため0、ディクショナリ内のすべての色にも0アルファが必要です。

于 2012-05-22T09:59:59.890 に答える