画像が固定サイズであれば CanvasImageSource で十分です
画像サイズを都度変更したい場合には CanvasVirtualImageSource がより適しています
以下は、参考としてお絵描きアプリで選択した範囲(矩形)を CanvasVirtualImageSource に転写する処理です。
<Image x:Name="MyImage" />
this.cvis = new CanvasVirtualImageSource(CanvasDevice.GetShared(), 1, 1, 96);
MyImage.Source = cvis.Source;
void CopyImageToCvis(CanvasRenderTarget sourceImage, Rect clipRect)
{
cvis.Resize(clipRect.ToSize());
using (var ds = _cvis.CreateDrawingSession(Colors.Transparent, _cvis.Size.ToRect()))
{
ds.DrawImage(sourceImage, clipRect);
}
}
移動処理は省略しましたが、MyImage.RenderTransformにTranslateTransformを指定したりCanvas.SetTop(),SetLeft()を指定したりして選択範囲を移動させることができます
CanvasVirtualImageSourceのメリット
- CanvasControlやVirtualCanvasControlなどで必要なメモリリーク対策のRemoveFromVisualTree()を実行しなくてもよい
- Disposeも不要
- Resize()を通じてサイズ変更を明示でき、表示にも反映される
- CreateDrawingSession()にて描写した内容が表示に反映される
- 部分的な領域の書き換えが可能
- SuspendDrawingSession, ResumeDrawingSessionを利用することで、複数レイヤーの選択範囲の消しこみと仮画像への転写に伴うCreateDrawingSessionを挟みながら、選択範囲の描写内容をCanvasVirtualImageSourceに描きこむ処理を一度のイテレーションで完了できる