title author date CreateTime categories
WPF 通过 DrawingContext DrawImage 绘制图片
lindexi
2018-11-26 16:13:14 +0800
2018-11-26 15:4:7 +0800
WPF

本文告诉大家如何通过 DrawingContext 绘制图片,同时指定绘制图片在画布的某个区域和绘制出来的图片大小,如何裁剪图片

在 WPF 中可以使用 DrawingVisual 进行底层的绘制,底层的绘制的效率是比较高的,但是因为 WPF 的界面需要的是 UIElement 如果想要添加 DrawingVisual 还需要写一个帮助类

    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 加入到界面

    <Grid>
<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);
}

需要需要裁剪圆形,可以依靠 PushClip 裁剪

下面代码裁剪一个圆形的范围,从圆心 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);
}

最新文章

  1. maven如何配置
  2. 矩阵k次幂 采用三重循环
  3. SQL Server 表变量和临时表的区别
  4. 报表引擎API开发入门—带参程序数据集
  5. 移动设备和SharePoint 2013 - 第3部分:推送通知
  6. Cocos2d-x实例:设置背景音乐与音效- AppDelegate实现
  7. RefernceError : jQuery is not define
  8. Qt Quick 简单教程 - 1 (代码备忘)
  9. samba错误
  10. C#-循环滚动字幕,timer,从左至右,从右至左,暂停---ShinePans
  11. 微通道产品经理Grover采访:美国的微通道设计
  12. 随想录(从apple的swift语言说起)
  13. 包(package)
  14. Nginx是如何处理Request的?
  15. 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。
  16. 重构 改善既有代码的设计 Replace Method with Method Object(以函数对象取代函数)
  17. VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中
  18. HDU 2199 Can you solve this equation?(二分精度)
  19. MySQLdb in Python: “Can&#39;t connect to MySQL server on &#39;localhost&#39;”
  20. lshw查看系统硬件信息

热门文章

  1. java并发系列(六)-----Java并发:volatile关键字解析
  2. 2019.9.20 csp-s模拟测试48 反思总结
  3. day18 13.乐观锁介绍
  4. Linux环境变量的种类
  5. 跟我一起使用webpack给一个开源项目添加一个运行入口
  6. bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并
  7. node的源码安装
  8. SVN客户端操作(clean up|commit|update)系统找不到指定的文件
  9. laravel-- 在laravel操作redis数据库的数据类型(string、哈希、无序集合、list链表、有序集合)
  10. map.(parseInt)方法详解