2018-11-26-WPF-通过-DrawingContext-DrawImage-绘制图片
2024-09-06 06:44:30
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);
}
最新文章
- maven如何配置
- 矩阵k次幂 采用三重循环
- SQL Server 表变量和临时表的区别
- 报表引擎API开发入门—带参程序数据集
- 移动设备和SharePoint 2013 - 第3部分:推送通知
- Cocos2d-x实例:设置背景音乐与音效- AppDelegate实现
- RefernceError : jQuery is not define
- Qt Quick 简单教程 - 1 (代码备忘)
- samba错误
- C#-循环滚动字幕,timer,从左至右,从右至左,暂停---ShinePans
- 微通道产品经理Grover采访:美国的微通道设计
- 随想录(从apple的swift语言说起)
- 包(package)
- Nginx是如何处理Request的?
- 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。
- 重构 改善既有代码的设计 Replace Method with Method Object(以函数对象取代函数)
- VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中
- HDU 2199 Can you solve this equation?(二分精度)
- MySQLdb in Python: “Can&#39;t connect to MySQL server on &#39;localhost&#39;”
- lshw查看系统硬件信息
热门文章
- java并发系列(六)-----Java并发:volatile关键字解析
- 2019.9.20 csp-s模拟测试48 反思总结
- day18 13.乐观锁介绍
- Linux环境变量的种类
- 跟我一起使用webpack给一个开源项目添加一个运行入口
- bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并
- node的源码安装
- SVN客户端操作(clean up|commit|update)系统找不到指定的文件
- laravel-- 在laravel操作redis数据库的数据类型(string、哈希、无序集合、list链表、有序集合)
- map.(parseInt)方法详解