0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CanvasVirtualImageSourceに描画して<Image>に反映する

0
Last updated at Posted at 2026-02-05

画像が固定サイズであれば 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に描きこむ処理を一度のイテレーションで完了できる
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?