2017-12-07 4 views
0

Ich benutze WPF und ich möchte einige Pixel meines Bildes manipulieren. Ich verwende WritableBitmap, weil ich es indirekt aus der Quelle verwenden kann. Wenn ich versuche, einige Pixel RGB-Werte (in der Reihenfolge) zu setzen, ist das Ergebnis nicht das, was ich erwartet habe. Ich verwende diese Erweiterungsmethode Quelle zum:WriteableBitmap setze Pixel

 public static PixelColor[,] CopyPixels(this BitmapSource source,out int stride) 
     { 
      if (source.Format != PixelFormats.Bgra32) 
       source = new FormatConvertedBitmap(source, PixelFormats.Bgra32, null, 0); 
       PixelColor[,] pixels = new PixelColor[source.PixelWidth, source.PixelHeight]; 
       stride = source.PixelWidth * ((source.Format.BitsPerPixel + 7)/8); 
       GCHandle pinnedPixels = GCHandle.Alloc(pixels, GCHandleType.Pinned); 
       source.CopyPixels(
        new Int32Rect(0, 0, source.PixelWidth, source.PixelHeight), 
        pinnedPixels.AddrOfPinnedObject(), 
        pixels.GetLength(0) * pixels.GetLength(1) * 4, stride); 

      pinnedPixels.Free(); 
      return pixels; 
     } 

Der Ausgang struct ist

[StructLayout(LayoutKind.Sequential)] 
public struct PixelColor 
{ 
    public byte Blue; 
    public byte Green; 
    public byte Red; 
    public byte Alpha; 
} 

Dies ist die einfache Beispiel Code zu Pixel ändern (zwischen 200x200 und 300x300) zu schwarz:

 int stride = 0; 
     PixelColor[,] PixelData = wBitmap.CopyPixels(out stride); 

     for (int i = 0; i < PixelData.GetLength(0); i++) 
     { 
      for (int j = 0; j < PixelData.GetLength(1); j++) 
      { 

       if ((200 < i && 300 > i) && (200 < j && 300 > j)) 
       { 
        PixelData[i, j].Blue = 0; 
        PixelData[i, j].Red = 0; 
        PixelData[i, j].Green = 0; 

       } 

      } 
     } 

     wBitmap.WritePixels(new Int32Rect(0, 0, wBitmap.PixelWidth, wBitmap.PixelHeight), PixelData, stride,0); 

Das überraschende Ergebnis ist enter image description here

Dies ist ein Bild mit 500x500 Parametern. Ich erwartete, dass das Ergebnis ein schwarz gefülltes Quadrat in der Mitte des Bildes anstelle von schwarzen vertikalen Linien sein wird. Was ist das Problem mit meinem Beispielcode? (Die bunten Punkte hinter den Linien sind Teil des ursprünglichen Bildes.)

+0

Gerade falls Sie nicht aware, [WriteBitmapEx] (https://writeablebitmapex.codeplex.com/) ist großartig. –

Antwort

2

ändern Sie einfach die Reihenfolge der Dimensionen in der 2-dimensionalen Array-Deklaration in der copypixels Methoden:

var pixels = new PixelColor[source.PixelHeight, source.PixelWidth]; 
+0

Ohh danke dir so sehr! –