標籤:
本文為個人部落格備份文章,原文地址:
http://validvoid.net/win2d-offscreen-drawing/
應用有時需要將圖形繪製到並不立即顯示的目標上。此類繪製動作被稱作“幕後繪製”或“繪製到紋理”。當應用需要將繪製操作輸出儲存到一個檔案、返回為一個像素數組或留作後續操作的輸入源時,常需要進行這種幕後繪製。
通過使用 Win2D 中的 CanvasRenderTarget 可以輕鬆實現以上情境。
CanvasRenderTarget 派生自 CanvasBitmap ,包含一個名為 CreateDrawingSession()的方法。是用 CreateDrawingSession 方法可以把圖形內容繪製到一個 CanvasRenderTarget。例如:
CanvasDevice device = CanvasDevice.GetSharedDevice();CanvasRenderTarget offscreen = new CanvasRenderTarget(device, width, height, 96);using (CanvasDrawingSession ds = offscreen.CreateDrawingSession()){ ds.Clear(Colors.Black); ds.DrawRectangle(100, 200, 5, 6, Colors.Red);}
注意上述樣本中調用了一個 Clear 方法。不調用此方法,位元影像則會以未定義內容進行初始化。通過 CanvasRenderTarget 建立的繪圖會話 (drawing sessions) 與 Win2D 提供的 XAML 控制項建立的繪圖會話對 Clear (清除)行為的處理是不同的。這種差異使得應用可以對(多個) CanvasRenderTarget 進行增量修改,而不必每次都重繪整個情境。
要把一個 CanvasRenderTarget 繪製到另一個繪製會話上,只需調用DrawImage(ICanvasImage) 方法或其任意一個重載即可。例如:
void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args){ args.DrawingSession.DrawImage(offscreen, 23, 34);}
CanvasRenderTarget 繼承了 IGraphicsEffectSource 介面,因此還可以把一個 CanvasRenderTarget 作為輸入源,傳入到一個特效 (Effect)進行使用。例如:
GaussianBlurEffect blurEffect = new GaussianBlurEffect(){ Source = offscreen, BlurAmount = 3.0f};
應用能夠在一個 CanvasRenderTarget 上多次反覆關閉、重開(多個)繪製會話。
在繪製會話對象被釋放之前,繪製操作都不會應用到 CanvasRenderTarget。在 C# 裡,使用 using 語句塊就能妥善處理這一問題。
另外值得一提的是 CanvasRenderTarget 並不是一個 XAML 控制項,它與 XAML 元素樹完全無關。因此它適用於任何 XAML 或非 XAML 應用。
Win2D 官方文章系列翻譯 - 幕後繪製