私は本質的に色の2次元配列であり、各インデックスはピクセルを表し、値はそのピクセルの色です。簡単にするために、基本的に1ピクセルの赤の行、1ピクセルの緑の行、1ピクセルの青の行を持つ3x3ピクセルの配列を想像してみましょう。
Color[,] colorArray = new Color[3,3];
for (int i = 0; i < 3; ++i)
{
colorArray[0,i] = Colors.Red;
colorArray[1,i] = Colors.Green;
colorArray[2,i] = Colors.Blue;
}
画像を含むXAMLファイルがあります(ここでも、簡単にするために、画像も3x3ピクセルであると仮定します)。上記のピクセルデータをその画像ファイルに表示できるものに書き込むにはどうすればよいですか?
編集:
私は両方WriteableBitmaps
を使用しようとしましBitmapSources
たが、それらを機能させることができないようです。たとえば、次のコード(画面全体を黄色にペイントしようとしている場合)は、白い画像(ここから借用)になります。
BitmapSourceの例
uint[] pixelData = new uint[width * height];
for (int y = 0; y < height; ++y)
{
int yIndex = y * width;
for (int x = 0; x < width; ++x)
{
pixelData[x + yIndex] = (0 << 24) + (255 << 16) + (255 << 8) + 255;
}
}
var bmp = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgra32, null, pixelData, width * 4);
TestImage.Source = bmp;
WriteableBitmapの例
WriteableBitmap wb = new WriteableBitmap(width, height, dpi, dpi, pf, null);
byte[] pixelData = new byte[height * width * 4];
for (int i = 0; i < (int)wb.Height; i++)
{
for (int j = 0; j < (int)wb.Width; j++)
{
var color = colors[i, j];
var idx = j * 4 + i * width * 4;
byte blue = color.B;
byte green = color.G;
byte red = color.R;
pixelData[idx] = blue;
pixelData[idx + 1] = green;
pixelData[idx + 2] = red;
pixelData[idx + 3] = 255;
//byte[] colorData = { blue, green, red, 255 };
//Int32Rect rect = new Int32Rect(j, i, 1, 1);
//wb.WritePixels(rect, colorData, 4, 0);
}
}
Int32Rect rect = new Int32Rect(0, 0, width, height);
wb.WritePixels(rect, pixelData, 4, 0);
TestImage.Source = wb;