DrawTool画笔之纹理笔
先上图:

今天我们要实现的是DrawTool画笔集合中的一种纹理笔,很多人可能对纹理笔概念还比较生疏,其实如果你接触过类似一些教育行业交互式白板的话,对纹理笔并不会感到陌生,纹理笔我们可以简单的理解为是一种通过图片来呈现笔迹的方式.在继续下面的阅读前,你有必要先了解下以下知识:
- 1.WPF中笔迹线程处理模型
- 2.自定义呈现笔迹
- 3.截获触笔输入
通过上面的文章,我们知道DynamicRenderer为我们提供是呈现,而Stroke是最后我们生成笔迹,如果要实现纹理笔,我们需要重载DynamicRenderer的OnDraw和Stroke的DrawCore方法.
1. 自定义Stroke
public class TextureStroke : Stroke
{
private System.Windows.Media.ImageSource imageSource_;
//纹理图片
private string textureFile_;
public TextureStroke(StylusPointCollection stylusPoints, DrawingAttributes da , string file )
: base(stylusPoints, da)
{
this.textureFile_ = file;
this.imageSource_ = new System.Windows.Media.Imaging.BitmapImage(new Uri(this.textureFile_));
} /// <summary>
/// 实现绘制
/// </summary>
/// <param name="drawingContext"></param>
/// <param name="drawingAttributes"></param>
protected override void DrawCore(DrawingContext drawingContext, DrawingAttributes drawingAttributes)
{
double width = drawingAttributes.Width * 2.0;
System.Windows.Media.StreamGeometry streamGeometry = new System.Windows.Media.StreamGeometry();
using (System.Windows.Media.StreamGeometryContext streamGeometryContext = streamGeometry.Open())
{
streamGeometryContext.BeginFigure((Point)base.StylusPoints[], false, false);
foreach (System.Windows.Input.StylusPoint current in base.StylusPoints)
{
streamGeometryContext.LineTo((Point)current, true, true);
}
streamGeometryContext.Close();
} DrawTexture(streamGeometry, this.imageSource_, drawingContext, width, this.textureFile_);
} public static void DrawTexture(Geometry geometry, ImageSource imageSource, DrawingContext drawingContext, double width, string imagePath)
{
Rect rc = geometry.Bounds;
DrawingBrush drawingBrush = new DrawingBrush(new ImageDrawing
{
Rect = rc,
ImageSource = imageSource
});
drawingBrush.TileMode = TileMode.Tile;
Uri uriSource = new Uri(imagePath);
BitmapImage bitmapImage = new BitmapImage(uriSource);
drawingBrush.Viewport = new Rect(0.0, 0.0, (double)bitmapImage.PixelWidth, (double)bitmapImage.PixelHeight);
drawingBrush.ViewportUnits = BrushMappingMode.Absolute;
PathGeometry widenedPathGeometry = geometry.GetWidenedPathGeometry(new Pen(null, width)
{
StartLineCap = PenLineCap.Round,
EndLineCap = PenLineCap.Round
});
Pen pen = new Pen(drawingBrush, 80.0);
drawingContext.PushClip(widenedPathGeometry);
drawingContext.DrawRectangle(drawingBrush, pen, rc);
drawingContext.Pop();
}
}
2.实例应用
这里我们使用到上篇文章中介绍的多点触摸画板 ,修改其中_startStroke方法中stroke对象的生成,相应代码如下:
bool isTexturePen = true ; // 外部定义的私有变量
private void _startStroke(object device, Point inputPosition){
// ... { some code }
//==这里根据变量isTexturePen来判断使用默认的stroke还是自定义的stroke
Stroke stroke = isTexturePen==true ? new TextureStroke( stylusPointCollection , this._inkCanvas.DefaultDrawingAttributes,"c:\\1.png") : new Stroke(stylusPointCollection);
//end
// .... { some code }
}
3. 结束
DrawTool系列文章中涉及的代码都是通过修改后的,仅仅适用于demo场景,如果需要商业请自行修改,包括性能上的调整.
DrawTool画笔之纹理笔的更多相关文章
- DrawTool画笔之图形笔
相关知识参考DrawTool画笔之纹理笔 , 图形笔的实现跟纹理笔的实现是一样的,重载Stroke的DrawCore方法,效果图: --------------------------------- ...
- DrawTool多重笔之前奏 => 通过InkAnalyzer实现图形识别
这里要介绍的是通过InkAnalyzer来实现简单图形的识别,例如圆,椭圆,正方形,三角形等,当然你也可以通过扩展来实现自定义图形的识别,在使用InkAnalyzer前,你需要引用IAWinFX.dl ...
- 多点触摸画板(MultiTouchCanvas)
这是个简单的支持多点触摸的画板控件, 绘制功能基于WPF InkCanvas,也是我drawTool系列文章的开篇. 阅读该文章后可能产生一些问题: 1. 如果对生成的笔迹对象进行控制 如果要对生成的 ...
- 超全面的.NET GDI+图形图像编程教程
本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...
- CG基础教程-陈惟老师十二讲笔记
转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...
- Photoshop技能167个经典的Photoshop技巧大全
Photoshop技能167个经典的Photoshop技巧大全 学PS基础:Photoshop 技能167个 经典的Photoshop技巧大全,如果你是初级阶段的水平,熟读此文并掌握,马上进阶为中级 ...
- GDI编程
图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...
- 干货分享,40个photoshop技能送给你!
自从有了“PS(Photoshop)”以后,很多事情变成了可能,你可以上九天揽月,也可以下五洋捉鳖,照片中,你可以出现在任何你想在的地方.而最基本的美化照片的功能,我想是很多同学学习PS的初衷.当你掌 ...
- ps基础入门快捷方法总结
1. 快速打开文件 双击Photoshop的背景空白处(默认为灰色显示区域)即可打开选择文件的浏览窗口. 2. 随意更换画布颜色 选择油漆桶工具并按住Shift点击画布边缘,即可设置画布底色为当前选择 ...
随机推荐
- Constructing Roads In JGShining's Kingdom
点击打开题目链接 本题目是考察 最长递增子序列的 有n^2 n(logn) n^2 会超时的 下面两个方法的代码 思路 可以百度LIS LCS dp里面存子序列 n(logn) ...
- Linux服务:使用Supervisor管理进程
一.简介 由于基本每个公司都会用到supervisor这个进程管理工具,这里简单阐述一下. Supervisor (http://supervisord.org) 是一个用Python写Linux下的 ...
- JavaScript实现Select选择本周、上周、本季、上季、本年的时间选取
//转自http://blog.csdn.net/xc_young/article/details/16878849,其上季度有错误,已修改 var MrYangUtil = function () ...
- error: declaration of 'cv::Mat R ' shadows a parameter
变量被覆盖. 例: void pose_estimation_2d2d::_pose_estimation_2d2d(const vector<KeyPoint> &v_keypo ...
- 1.5-1.6 oozie部署
一.部署 可参考文档:http://archive.cloudera.com/cdh5/cdh/5/oozie-4.0.0-cdh5.3.6/DG_QuickStart.html 1.解压oozie ...
- iOS QQ 登录
QQSDK 看官网的文档,确实让人头疼的一件事,说是两个资源文件,就找到了一个(TencentOpenAPI.framework),Demo中也没有找到. 接下来具体实现: 导入库: 添加SDK依赖的 ...
- TP5之上传多张图片
1.效果图(每点击一次‘添加选项’,就会有一个新的 file 框来添加新的图片) 2.view <!--不要忘了引入jquery文件--> <!-- post传值方式和文件传输协议一 ...
- HTML5 中的meter 标签的样式设置
meter { -webkit-appearance: none; position: relative; display: block; margin: 8px auto; width: 100px ...
- github新手使用
1.首先要先在github的官网注册一个属于自己的账号.https://github.com/ 2.注册完成后需要一些简单的设置,先创建一个属于自己的仓库,repository 3.创建仓库 4.如何 ...
- Tessellation
Tessellation细分曲面技术是AMD(ATI)常年研发多代的技术,经过多年发展最终被采纳成为DX11的一项关键技术,因此历来都是宣传重点.和光线追踪不同,现在的光栅化图形渲染技术的核心是绘制大 ...