2018-11-26-WPF-通过-DrawingContext-DrawImage-绘制图片
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);
}
2018-11-26-WPF-通过-DrawingContext-DrawImage-绘制图片的更多相关文章
- Canvas中 drawImage绘制图片不显示
在学习 html5中的 Canvas.drawImage时写了如下代码: <!doctype html> <html> <head><title>研究& ...
- 软件项目技术点(8)—— canvas调用drawImage绘制图片
AxeSlide软件项目梳理 canvas绘图系列知识点整理 html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本 ...
- 2018.11.26 QLU新生赛部分题解
问题 L: 寄蒜几盒? 题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Ye ...
- 2018.11.26 struts2流程源码
struts2的架构图 从最上面的类开始,也就是i 我们的核心过滤器strutsPrepareAndExecuteFilter 判断当前请求是否由struts2来处理,如果是就往else走,不由它来处 ...
- (链接)IDEA 2018 激活 IDEA 2018.3激活教程 最新的(三种)—2018.11.26亲测
破解不成功的请注意时效性,写于2019/2/8,以下第一种激活方法亲测可用, 不过有时候破解成功了可能过几天突然就打不开了,双击无反应的说,这时候再按顺序 操作一遍就是了: 1)把idea64.exe ...
- C# 解决DrawImage绘制图片拉伸产生渐变
ImageAttributes ImgAtt = new ImageAttributes(); ; ImgAtt.SetWrapMode(System.Drawing. ...
- context.drawImage绘制图片
context.drawImage(img,x,y) x,y图像起始坐标 context.drawImage(img,x,y,w,h) w,h指定图像的宽度和高度 context.drawImage ...
- Canvas 中drawImage 绘制不出图片
在使用Canvas的drawImage绘制图片时,却发现绘制不出图片,原因是图片是异步加载,图片加载完再绘制. //html <img src="1.png" /> & ...
- canvas绘制图片drawImage学习
不得不说,html5中的canvas真的非常强大,从图片处理,到视频处理,再到游戏开发,都能见到canvas的身影,然而,就这一个<canvas>标签,功能居然如此强大,这主要归功于can ...
- 借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制
原文:借助Photoshop,Illustrator等设计软件进行WPF图形图像的绘制 本文所示例子是借助第三方设计软件,制作复杂的矢量图形,转成与XAML酷似的SVG,再转换成xaml而实现的. 这 ...
随机推荐
- laravel-admin 自定义导出excel功能,并导出图片
https://www.jianshu.com/p/91975f66427d 最近用laravel-admin在做一个小项目,其中用到了excel导出功能. 但是laravel-admin自带的导出功 ...
- 系统日志和内核消息 $ dmesg$ less /var/log/messages$ less /var/log/secure$ less /var/log/auth
查看错误和警告消息,比如看看是不是很多关于连接数过多导致? 看看是否有硬件错误或文件系统错误? 分析是否能将这些错误事件和前面发现的疑点进行时间上的比对.
- 洛谷P2196 挖地雷 [2017年4月计划 动态规划13]
P2196 挖地雷 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之 ...
- 直白介绍卷积神经网络(CNN)【转】
英文地址:https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/ 中文译文:http://mp.weixin.qq.com/s ...
- 杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动
ylbtech-杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动 1.返回顶部 1. 天气暖和了,连心情都是阳光的.然而,在这美好的时刻,漫天飞舞的杨柳絮,甚是煞风景.<ignor ...
- excel怎么制作三维圆环图表
excel怎么制作三维圆环图表 excel怎么制作三维圆环图表?excel中想要制作一个三维圆环图表,该怎么制作呢?下面我们就来看看详细的教程,很简单,在Excel中,可以通过自带的圆环图功能生成二维 ...
- 如何高效的学习python
如何高效的学习python 假设到目前为止你已经知道Python或有一些学习它的方法,但是如果你喜欢我发现的不用几个月的时间就能迅速掌握其要领的学习语言的方法,那么这篇文章是为你准备的. 要避免的学习 ...
- Java 休眠(sleep)
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用.目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会. 你可以让程序休眠一毫秒的时间或者到您的计算 ...
- VLSM(可变长子网掩码)
http://blog.sina.com.cn/s/blog_635e1a9e0100yk51.html(转载) VLSM的介绍: VLSM(VLSM(Variable Length Subnetwo ...
- DELL(linux 系统里系统掉盘)(阵列Foreign)命令行里重做阵列
故障现象 (阵列Foreign 系统下重做阵列) 例:四合一机器(DELL_XENCOMPA09) 有四个硬盘 如图 少认到一个 df -h fdisk -l 2>/dev/null | gr ...