WPF/Silverlight深度解决方案:(四)基于像素的图像合成(For WPF)
传统的基于GDI或GDI+的图形开发大家再熟悉不过了,通过Drawing类可以轻松的对位图进行处理,那么在WPF中的Media类是否也拥有同样类似的方法功能呢?这是肯定的。
本节我以精灵装备合成Show(纸娃娃)为例向大家演示如何在WPF中实现基于像素的图象合成。
首先准备一下合成用的素材:
统一好它们的规格尺寸及命名后将之嵌入进项目资源:
接下来是进行绘图的第一步:创建绘图工具实例并开启绘图:
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
接着按深度顺序从底到外逐个对象绘制:
BitmapSource weapon = GetImage(
string.Format("Image/Weapon_{0}.png",
(comboBox1.SelectedItem as ComboBoxItem).Content)
);
drawingContext.DrawImage(weapon, new Rect(18, 18, 120, 120));
通过以上代码,我们将位于"Image/Weapon_{0}.png"的武器图片绘制到一个x,y方向偏移量分别为(18,18)的120*120像素的矩形上,其中的GetImage方法为:
//图片加载
private BitmapSource GetImage(string uri) {
try {
return BitmapFrame.Create(new Uri(string.Format(@"{0}", uri), UriKind.Relative));
} catch {
return null;
}
}
然后通过相类似的代码再分别依次绘制身体、左手、右手、头部、坐骑等部位:
//绘制身体
BitmapSource body = GetImage(
string.Format("Image/Body_{0}.png",
(comboBox2.SelectedItem as ComboBoxItem).Content)
);
drawingContext.DrawImage(body, new Rect(50, 50, 100, 100));
//绘制左手
BitmapSource LeftHand = GetImage(
string.Format("Image/LeftHand_{0}.png",
(comboBox3.SelectedItem as ComboBoxItem).Content)
);
drawingContext.DrawImage(LeftHand, new Rect(72, 52, 30, 30));
//绘制右手
BitmapSource RightHand = GetImage(
string.Format("Image/RightHand_{0}.png",
(comboBox4.SelectedItem as ComboBoxItem).Content)
);
drawingContext.DrawImage(RightHand, new Rect(98, 59, 30, 30));
//绘制头部
BitmapSource Head = GetImage(
string.Format("Image/Head_{0}.png",
(comboBox5.SelectedItem as ComboBoxItem).Content)
);
drawingContext.DrawImage(Head, new Rect(86, 38, 20, 30));
//绘制坐骑
BitmapSource Horse = GetImage(
string.Format("Image/Horse_{0}.png",
(comboBox6.SelectedItem as ComboBoxItem).Content)
);
drawingContext.DrawImage(Horse, new Rect(63, 71, 70, 120));
所有对象绘制完后即可以关闭画板并呈现出来:
drawingContext.Close();
RenderTargetBitmap composeImage = new RenderTargetBitmap(200, 200, 0, 0, PixelFormats.Pbgra32);
composeImage.Render(drawingVisual);
最后将composeImage这个合成的图片作为图片源赋值给精灵即完成了整个合成流程:
Spirit.Source = composeImage;
实现后的系统界面如下:
本节以展示如何在WPF中对像素位图进行合成,由于素材资源有限,因此无法为大家演示动画效果的纸娃娃图片合成系统。但是万变不离其中,只要您掌握了本文的方法并合理的处理好图片组的缓存,这将为您的图片合成带来更高的性能与效果。
下一节我将为大家讲解如何在Silverlight中实现一模一样的效果,这就是传说中的移植,敬请关注。
出处:http://alamiye010.cnblogs.com/
本系列目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。
WPF/Silverlight深度解决方案:(四)基于像素的图像合成(For WPF)相关推荐
- WPF/Silverlight深度解决方案:(十六)传值实现
许多开发者在从.NET网站开发向Silverlight转型过程中往往都会经历一个比较郁闷的过度期:Silverlight作为镶嵌在网页中的插件,如何能像传统ASP.NET网页一样实现页面切换及参数传递 ...
- WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中)
通过上一节的解说,大家是否已经对HLSL有了较深刻的认识和理解,HLSL的渲染不仅仅局限于静态处理,通过时时更新HLSL代码的各全局变量值同样可以实现动画形式的渲染,非常Cool对吧~.那么本节我将向 ...
- WPF/Silverlight深度解决方案:(二)Silverlight源码之自我保护
Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...
- WPF/Silverlight深度解决方案:(二)Silverlight源码之自我保护(加密)
Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...
- WPF/Silverlight深度解决方案:Silverlight源码之自我保护
Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四) Be careful!前方怪物出没...
游戏的精灵框架到此为止算告一段落,让我们一同来体验它带来的神奇效应. 一个安静的黄昏,主角悠闲的甩着它帅气的毛发独跑于林阴大道.怎知天色已晚即将进入月亮的领地,嘿嘿,我们的故事就从这里开始:Be ca ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十四) 精灵控件横空出世!①
在上一节中,我们实现了地图牵引式移动,同时还遗留着一个小尾巴:主角和障碍物该如何跟随着地图的移动而移动? 上节中有点到,只要在地图移动的同时,时时根据主角等对象物体的X,Y坐标进行相对于地图的X,Y坐 ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十四) 精灵控件横空出世!①
在上一节中,我们实现了地图牵引式移动,同时还遗留着一个小尾巴:主角和障碍物该如何跟随着地图的移动而移动? 上节中有点到,只要在地图移动的同时,时时根据主角等对象物体的X,Y坐标进行相对于地图的X,Y坐 ...
- [Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十九) 落雷!治疗!陷阱!连锁闪电!多段群伤!魔法之终极五重奏②...
本节,我将完成本教程示例游戏的最终两个魔法:传说中的连锁闪电与暴风雪.如此经典与华丽的家伙无论在哪款好游戏中都少不了它们的踪影. 首先是连锁闪电,在<英雄无敌>中体现得尤为出色,击中一个怪 ...
最新文章
- 怎么主动发起话题_谈恋爱怎样找话题聊天?
- Android之ListView优化
- 洛谷 - P2181 - 对角线 - 打表 - 组合数学
- 如何将文件拷贝服务器上,如何将文件复制到云服务器上
- 【AI视野·今日CV 计算机视觉论文速览 第217期】Thu, 10 Jun 2021
- 数字逻辑要不要认真学_认真认真
- linux中dns超时时间,Linux DNS timeout, attempts.---DNS超时,重试的配置
- akamai 指纹 和 akamai BMP 移动端sensor 风控分析
- 冯诺依曼体系结构与计算机基本组成
- 服务器系统安装ansys,云服务器安装ansys
- 基于FPGA板的音乐盒的设计
- 当前 .NET SDK 不支持将 .NET Core 2.2 设置为目标。请将 .NET Core 2.1 或更低版本设置
- html5 mp4转换ogv格式,如何将mp4视频转换成ogv高清视频呢
- Word2Vec 源码
- Python笔记_81_结算页面_订单模型_优惠券
- 数据结构与算法(十一)Trie字典树
- 带你玩转区块链--以太坊基础、发币、基于智能合约实现彩票项目-第二章-第一节【以太坊篇】
- 基于协同过滤的算法 图书推荐系统
- nodejs+ffmpeg视频转码
- 操作系统—存储器管理
热门文章
- React-Native集成dva.js
- esp32-智能语音-mp3(sdcard)
- 首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。(已完善)...
- System V 共享内存区
- 我是如何战胜懒惰的?
- 深入学习GridBagLayout
- *为需要读写VRML(.wrl)文件的同志们指点一条路
- 1.maven下仅shiro框架对shiro的测试使用
- javascript时间戳转换成yyyy-MM-DD格式
- Java web切面编程