以下のやり方で、C++のメモリビットマップ、メモリDCのやり方ができそうだ。
WPFはヒットテストをCanvasへのオブジェクト追加することで簡単に実装できるようだが、お絵描きではなく画像処理においては実際のピクセル単位で解析する際には使えないような気がしている。
private RenderTargetBitmap _bmpMem;
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);
// ヒットテスト用
if (_bmpMem != null)
{
DrawingVisual dv = new DrawingVisual();
using (DrawingContext drawContent = dv.RenderOpen())
{
drawContent.DrawRectangle(Brushes.Black, null,
new Rect(0,0, _bmpMem.Width, _bmpMem.Height));
// 描画コード
_drawObjects.RenderBackGround(drawContent);
}
_bmpMem.Render(dv);
}
// メモリビットマップを以下の方法で描画できる。
if (_bmpMem!= null)
{
dc.DrawImage(_bmpMem,
new Rect(0, 0, _bmpMem.Width, _bmpMem.Height));
}
}
public DrawObject? HitTest(Point point)
{
DrawObject? obj = null;
// 1×1ピクセルを読み込むための矩形
var rect = new Int32Rect((int)point.X, (int)point.Y, 1, 1);
// 1ピクセルあたりのバイト数 = BitsPerPixel/8
int bytesPerPixel = PixelFormats.Pbgra32.BitsPerPixel / 8; // → 16/8 = 2
// バッファを用意
byte[] pixel = new byte[bytesPerPixel];
// CopyPixels で (x,y) の 1×1 領域を buffer にコピー
_bmpMem.CopyPixels(rect, pixel, bytesPerPixel, 0);
if (pixel[0] != 0)
{
obj = _drawObjects.GetAtObject(pixel[0]);
}
return obj;
}