2017-05-11 18 views
-4

私は現在、黒い図形を持つpngを持つプロジェクト(c#WPF)に取り組んでいます。他はすべて透明です。BgrA32を使って作業する

私がしたいのは、黒いピクセルの色を変更するだけです。私はメソッドの入力として色を決定したいと思います。今はちょうどピクセルを変更するといいでしょう。たぶん私はループになると間違った考え方になっています(それはすべてがグリーン・アトムになります)。

私は、解決策を見つけるためにウェブを精査しようとしました。

私が行ったことは、書き込み可能なビットマップからピクセルを取り出すことです。 下記のコードを参照してください。あなたたちはそれを把握した場合

それはあなたが個別にすべてのバイトをループすることによって自分自身のために困難にそれを作っている私の一日:)

private void ChangeColor() 
    { 
     var projectPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; 
     string filePath = System.IO.Path.Combine(projectPath, "Resources"); 

     BitmapImage img = new BitmapImage(new Uri(filePath + @"\Vogn1.png", UriKind.Relative)); 

     WriteableBitmap myBitmap = new WriteableBitmap(img); 

     int stride = myBitmap.PixelWidth * 4; 
     int size = myBitmap.PixelHeight * stride; 
     byte[] pixels = new byte[size]; 
     myBitmap.CopyPixels(pixels, stride, 0); 
     int iDex = 0; 
     bool black = false; 

     for (int i = 0; i < pixels.Length; i++) 
     { 
      //if(pixels[i] == 255) 

      if (iDex == 1 || iDex == 3) 
       pixels[i] = 255; 
      else 
       pixels[i] = 0; 
      iDex++; 

      if (iDex == 4) 
       iDex = 0; 
     } 

     myBitmap.WritePixels(new Int32Rect(0, 0, myBitmap.PixelWidth, myBitmap.PixelHeight), pixels, stride, 0); 

     Wagon15.Source = myBitmap; 
    } 
+0

問題は何ですか。すでに各ピクセルの4バイトを正常に操作しています。しかし、あなたはこれを見てみたいです:http://stackoverflow.com/a/39189895/1136211 – Clemens

+0

リンクをありがとう。多くのappriciated! :) –

答えて

1

節約になります。代わりに、4バイトごとにループして、ピクセルのすべてのバイトを一度に操作します。

for (int i = 0; i < pixels.Length; i += 4) 
{ 
    if ( pixels[i] == 0 
     && pixels[i+1] == 0 
     && pixels[i+2] == 0) // All Black 
    { 
     pixels[i] = 255; // Blue 
     pixels[i+1] = 255; // Green 
     pixels[i+2] = 255; // Red 
    } 
} 
+0

さよなら。ありがとう! :) アルファとは何ですか?それは何のために使われますか? –

+0

@ IstBarP-Patrickあなたは「私は黒人の人物を持っているpngを持っている、他のものはただ透明だ」と書きました。それがピクセル値の観点からどのように機能するか考えたことはありますか? – Clemens

+0

@ IstBarP-パトリック・アルファは、ピクセルの透明度レベルです.0は完全に透明、255は完全に不透明です。 – Abion47