2012-03-26 3 views
6

に置き換えます。イメージの一部の色をテクスチャに影響を与えずに置き換える方法は何ですか?イメージ内の色をC#

あなたはhere
おかげ

答えて

2

、これはRGB <が必要です 2.ターゲット色のHSL値
3.取得の画像ピクセルを取得し、各画素について:
4ピクセルのHSL値を計算し、(pixelHsl/refHsl)* targetHsl

と交換しますこれは助けてくれたすべての人に感謝してくれた。

+0

はい、魅力的です。なぜコメントすることができますか? –

+1

あなたはそれを置き換えるために使用したコードは何ですか? –

+0

あなたのコードはどこですか –

3

はこれを試して結果の良い例を見ることができます:

Color color = Color.Black; //Your desired colour 

byte r = color.R; //For Red colour 

Bitmap bmp = new Bitmap(this.BackgroundImage); 
for (int x = 0; x < bmp.Width; x++) 
{ 
    for (int y = 0; y < bmp.Height; y++) 
    { 
     Color gotColor = bmp.GetPixel(x, y); 
     gotColor = Color.FromArgb(r, gotColor.G, gotColor.B); 
     bmp.SetPixel(x, y, gotColor); 
    } 
} 
+0

'GetPixel'が非常に遅い、以下を参照してくださいhttp://stackoverflow.com/questions/4235731/is-there-a-faster-alternative-to-gdi-getpixel –

+0

はい非常に高速だがためではありません小さな画像の色は非常に効果的です。 –

+0

イメージの色を変更する際の1つの問題は、選択的ではないことです。つまり、ある部分で黒から赤に変えたい画像では不可能です。たとえば、人物の画像で、髪の色を赤に変えたい場合、それは不可能です。画像内のどこに表示されても、すべての黒のピクセルが赤に置き換えられます。 –

2

は、アルに、画素を読み出して3列の(RGB)でそれらを詰め込むようにしてくださいそこにあなたができますあなたの色を置き換えるために括弧で設定します。あなたが
を交換したい色を表す(HSL色の良いクラスがhere見つけることができます)
1(HSL)で基準値を取得します> HSLの変換 - それをする方法を見つけ

+0

こんにちは、ありがとう - これは私が必要とするものとは関係ありません。私が実際に必要とするのは、テクスチャを維持する方法で画像内の色を置き換えることです。 – Oren

+0

これはsommeと同じです。テクスチャは単なる色のバリエーションです。青い空と白い雲のようなものは、紫色の空とやや暗い紫色の雲やそのようなものです。 – jorne

8

効率的に色を置き換える1つの方法は、再マップテーブルを使用することです。次の例では、イメージボックス内にイメージが描画されます。 Paintイベントでは、カラーColor.BlackがColor.Blueに変更されます。

private void pictureBox_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 
    using (Bitmap bmp = new Bitmap("myImage.png")) 
    { 

     // Set the image attribute's color mappings 
     ColorMap[] colorMap = new ColorMap[1]; 
     colorMap[0] = new ColorMap(); 
     colorMap[0].OldColor = Color.Black; 
     colorMap[0].NewColor = Color.Blue; 
     ImageAttributes attr = new ImageAttributes(); 
     attr.SetRemapTable(colorMap); 
     // Draw using the color map 
     Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 
     g.DrawImage(bmp, rect, 0, 0, rect.Width, rect.Height, GraphicsUnit.Pixel, attr); 
    } 
} 

詳細情報:http://msdn.microsoft.com/en-us/library/4b4dc1kz%28v=vs.110%29.aspx

0

研究を行っている時に、私はこれを行うのない効率的/ smoothe方法を見つけていないので、私はそれをいけません私は、コードはきれいになるかもしれませんが、それは効率的ではありませんが、よりスムーズであり、あなたは公差を設定することができます。

public static Image ColorReplace(this Image inputImage, int tolerance, Color oldColor, Color NewColor) 
    { 
     Bitmap outputImage = new Bitmap(inputImage.Width, inputImage.Height); 
     Graphics G = Graphics.FromImage(outputImage); 
     G.DrawImage(inputImage, 0, 0); 
     for (Int32 y = 0; y < outputImage.Height; y++) 
      for (Int32 x = 0; x < outputImage.Width; x++) 
      { 
       Color PixelColor = outputImage.GetPixel(x, y); 
       if (PixelColor.R > oldColor.R - tolerance && PixelColor.R < oldColor.R + tolerance && PixelColor.G > oldColor.G - tolerance && PixelColor.G < oldColor.G + tolerance && PixelColor.B > oldColor.B - tolerance && PixelColor.B < oldColor.B + tolerance) 
       { 
        int RColorDiff = oldColor.R - PixelColor.R; 
        int GColorDiff = oldColor.G - PixelColor.G; 
        int BColorDiff = oldColor.B - PixelColor.B; 

        if (PixelColor.R > oldColor.R) RColorDiff = NewColor.R + RColorDiff; 
        else RColorDiff = NewColor.R - RColorDiff; 
        if (RColorDiff > 255) RColorDiff = 255; 
        if (RColorDiff < 0) RColorDiff = 0; 
        if (PixelColor.G > oldColor.G) GColorDiff = NewColor.G + GColorDiff; 
        else GColorDiff = NewColor.G - GColorDiff; 
        if (GColorDiff > 255) GColorDiff = 255; 
        if (GColorDiff < 0) GColorDiff = 0; 
        if (PixelColor.B > oldColor.B) BColorDiff = NewColor.B + BColorDiff; 
        else BColorDiff = NewColor.B - BColorDiff; 
        if (BColorDiff > 255) BColorDiff = 255; 
        if (BColorDiff < 0) BColorDiff = 0; 

        outputImage.SetPixel(x, y, Color.FromArgb(RColorDiff, GColorDiff, BColorDiff)); 
       } 
      } 
     return outputImage; 
    } 
関連する問題