私はWPFを使用しています。私は自分のイメージのいくつかのピクセルを操作したいと思います。私はWritableBitmapを使用しています。なぜなら、ソースから間接的に使用できるからです。私はいくつかのピクセルRGB値(順序)を設定しようとすると、結果は私が期待したものではありません。 Iソースを読み取るために、この拡張メソッドを使用する:WriteableBitmapピクセルを設定する
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;
}
出力構造体は
[StructLayout(LayoutKind.Sequential)]
public struct PixelColor
{
public byte Blue;
public byte Green;
public byte Red;
public byte Alpha;
}
これは黒に(200×200および300×300の間の)画素を修正するための簡単なコード例である:
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);
です。
これは500x500のパラメータを持つ画像です。私は結果が黒い縦線の代わりにイメージの真ん中に黒い塗りつぶされた正方形になることを期待しました。私のサンプルコードの問題は何ですか? (ラインの背後にあるカラフルなドットは、元の画像の一部である。)
念のためにあなたはありません[WriteBitmapEx](https://writeablebitmapex.codeplex.com/)はすばらしいです。 –