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
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.)
Gerade falls Sie nicht aware, [WriteBitmapEx] (https://writeablebitmapex.codeplex.com/) ist großartig. –