public class Element : UIElement
/// <inheritdoc />
public Element()
ContainerVisual = new ContainerVisual();
AddVisualChild(ContainerVisual);
/// <inheritdoc />
protected override Visual GetVisualChild(int index)
return ContainerVisual;
public ContainerVisual ContainerVisual { get; }
/// <inheritdoc />
protected override int VisualChildrenCount => 1;
将这个 Element 加入到界面
<local:Element x:Name="Element"></local:Element>
</Grid>
然后在构造函数添加一张图片,这时需要拖动一张图片进入解决方案
public MainWindow()
InitializeComponent();
var bitmapImage = new BitmapImage(new Uri("pack://application:,,,/1.jpg"));
var drawingVisual = new DrawingVisual();
using (DrawingContext dc = drawingVisual.RenderOpen())
dc.DrawImage(bitmapImage, new Rect(100, 100, 50, 50));
Element.ContainerVisual.Children.Add(drawingVisual);
现在可以看到图片在 100,100 的坐标画出,此时图片为被缩放到 50x50 也就是缩放画图片到指定的 Rect 上
如果只是需要画出被裁剪的图片,可以使用 CroppedBitmap 进行裁剪
在 CroppedBitmap 的构造可以传入需要裁剪的图片和如何裁剪,裁剪是进行矩形的裁剪
如下面代码是裁剪矩形从图片的左上角 50x50 范围
var croppedBitmap = new CroppedBitmap(bitmapImage, new Int32Rect(0, 0, 50, 50));
将两个图片同时画出来
public MainWindow()
InitializeComponent();
var bitmapImage = new BitmapImage(new Uri("pack://application:,,,/1.jpg"));
var drawingVisual = new DrawingVisual();
using (DrawingContext dc = drawingVisual.RenderOpen())
// 裁剪图片的 50x50 部分
var croppedBitmap = new CroppedBitmap(bitmapImage, new Int32Rect(0, 0, 50, 50));
dc.DrawImage(croppedBitmap, new Rect(10, 10, 50, 50));
dc.DrawImage(bitmapImage, new Rect(100, 100, 500, 500));
Element.ContainerVisual.Children.Add(drawingVisual);
下面代码裁剪一个圆形的范围,从圆心 30x30 开始裁剪半径为 20 的范围
dc.PushClip(new EllipseGeometry(new Point(30, 30), 20, 20));
使用裁剪之后的图片
public MainWindow()
InitializeComponent();
var bitmapImage = new BitmapImage(new Uri("pack://application:,,,/1.jpg"));
var drawingVisual = new DrawingVisual();
using (DrawingContext dc = drawingVisual.RenderOpen())
dc.PushClip(new EllipseGeometry(new Point(30, 30), 20, 20));
// 裁剪图片的 50x50 部分
var croppedBitmap = new CroppedBitmap(bitmapImage, new Int32Rect(0, 0, 50, 50));
dc.DrawImage(croppedBitmap, new Rect(10, 10, 50, 50));
dc.Pop();
dc.DrawImage(bitmapImage, new Rect(100, 100, 500, 500));
Element.ContainerVisual.Children.Add(drawingVisual);
本文会经常更新,请阅读原文:
https://blog.lindexi.com/post/WPF-%E9%80%9A%E8%BF%87-DrawingContext-DrawImage-%E7%BB%98%E5%88%B6%E5%9B%BE%E7%89%87.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://blog.lindexi.com
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请