2012-01-21 40 views
1

私は1つの原色を含む一連のアイコンを持っています。たとえば、アンチエイリアス処理された透明な背景を持つ黄色の星があります。画像の色を変更する

色相または彩度を変更して画像を紫色に変更する方法はありますか?

私はC#4.0を使用していますが、解決策がGDI +かWPFかどうかは気にしません。私はSystem.Drawing.Imageを使用してファイルを読み込んでいますが、必ずしも続ける必要はありません。画像は100x100よりも小さく、色を動的にしたいので、画像自体を編集してたくさんのコピーを作成するだけでは解決できません。

ColorMatrixクラスがありますが、それを使用してある色から別の色に変換する方法がわかりません。 rgb値を異ならせるのはかなり簡単ですが、どうやって色を変換できますか?

+0

はDanielA.White @:私は今、仕事をするとsetPixel一緒にハッキング()メソッドを持っているが、それは時間がかかりすぎます。 – Mark

答えて

2

C#の画像処理に関する驚くべきガイドについては、このリンクに従ってください。提出したユーザーを閲覧すると、ガイドの6つの部分すべてを見つけることができます。

http://www.codeproject.com/Articles/1989/Image-Processing-for-Dummies-with-C-and-GDI-Part-1

ガイドでは、画像データにアクセスするための、安全でないコードを使用する方法を示します。私は、安全なコードを保持し、次のように別の方法を使用することを好む:

 Bitmap b = new Bitmap(img1); 
     BitmapData bitmapData = b.LockBits(
      new Rectangle(0, 0, b.Width, b.Height), 
      ImageLockMode.ReadWrite, 
      PixelFormat.Format24bppRgb 
     ); 

     int numPixels = b.Width * b.Height; 
     byte[] pixels = new byte[numPixels * 3]; // 3 bytes per pixel 

     Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); 

     // Use this method to apply an effect to each pixel individually 
     for (int i = 0; i < pixels.Length; i++) 
     { 
      byte value = pixels[i]; 
      // modify value 
      pixels[i] = value; 
     } 

     // Use this method to apply an effect that considers RGB relationship 
     byte red, green, blue; 

     for (int i = 0; i < pixels.Length; i += 3) 
     { 
      blue = pixels[i]; 
      green = pixels[i + 1]; 
      red = pixels[i + 2]; 

      // modify values 

      pixels[i] = blue; 
      pixels[i + 1] = green; 
      pixels[i + 2] = red; 
     } 

     Marshal.Copy(pixels, 0, bitmapData.Scan0, pixels.Length); 

     b.UnlockBits(bitmapData); 

それぞれ異なる画像処理技術は、C#の特異的ではありません。アルゴリズムの基本的な理解で、このコードでそれを適用できるはずです。

2

world map

私はすべての海と海の色を変更するには、このコードを使用していた...私はすべてを取得...

まず は、多分それは少し長いですが、私は、これはあなたを助けると思いますnoktalarリスト内のピクセル

List<Nokta> noktalar = new List<Nokta>(); 


Bitmap bm = new Bitmap(pictureBox1.Image); 
for (int i = 0; i < pictureBox1.Height; i++) 
{ 
    for (int j = 0; j < pictureBox1.Width; j++) 
    { 
      Color col = bm.GetPixel(j, i); 
      Nokta n = new Nokta(); 
      n.point.X = j; 
      n.point.Y = i; 
      n.renk = col; 
      noktalar.Add(n); 
    } 
} 

そしてNoktaクラス:

public class Nokta 
{ 
    public Point point; 
    public Color renk;   
} 


deniz=noktalar.FindAll(FindDeniz); 


private static bool FindDeniz(Nokta n) 
{ 
    if (n.renk.Name == "ff000080") 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

そして最後に色変更...

public void changeDenizColor(Color c) 
{ 
    Bitmap bitmap = new Bitmap(pictureBox1.Image); 
    foreach (Nokta n in deniz) 
    { 
     n.renk = c; 
     bitmap.SetPixel(n.point.X, n.point.Y, c); 
     pictureBox1.Image = bitmap; 
    } 
} 
関連する問題