传统的基于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)相关推荐

  1. WPF/Silverlight深度解决方案:(十六)传值实现

    许多开发者在从.NET网站开发向Silverlight转型过程中往往都会经历一个比较郁闷的过度期:Silverlight作为镶嵌在网页中的插件,如何能像传统ASP.NET网页一样实现页面切换及参数传递 ...

  2. WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中)

    通过上一节的解说,大家是否已经对HLSL有了较深刻的认识和理解,HLSL的渲染不仅仅局限于静态处理,通过时时更新HLSL代码的各全局变量值同样可以实现动画形式的渲染,非常Cool对吧~.那么本节我将向 ...

  3. WPF/Silverlight深度解决方案:(二)Silverlight源码之自我保护

    Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...

  4. WPF/Silverlight深度解决方案:(二)Silverlight源码之自我保护(加密)

    Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...

  5. WPF/Silverlight深度解决方案:Silverlight源码之自我保护

    Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...

  6. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四) Be careful!前方怪物出没...

    游戏的精灵框架到此为止算告一段落,让我们一同来体验它带来的神奇效应. 一个安静的黄昏,主角悠闲的甩着它帅气的毛发独跑于林阴大道.怎知天色已晚即将进入月亮的领地,嘿嘿,我们的故事就从这里开始:Be ca ...

  7. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十四) 精灵控件横空出世!①

    在上一节中,我们实现了地图牵引式移动,同时还遗留着一个小尾巴:主角和障碍物该如何跟随着地图的移动而移动? 上节中有点到,只要在地图移动的同时,时时根据主角等对象物体的X,Y坐标进行相对于地图的X,Y坐 ...

  8. C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十四) 精灵控件横空出世!①

    在上一节中,我们实现了地图牵引式移动,同时还遗留着一个小尾巴:主角和障碍物该如何跟随着地图的移动而移动? 上节中有点到,只要在地图移动的同时,时时根据主角等对象物体的X,Y坐标进行相对于地图的X,Y坐 ...

  9. [Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  10. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十九) 落雷!治疗!陷阱!连锁闪电!多段群伤!魔法之终极五重奏②...

    本节,我将完成本教程示例游戏的最终两个魔法:传说中的连锁闪电与暴风雪.如此经典与华丽的家伙无论在哪款好游戏中都少不了它们的踪影. 首先是连锁闪电,在<英雄无敌>中体现得尤为出色,击中一个怪 ...

最新文章

  1. 怎么主动发起话题_谈恋爱怎样找话题聊天?
  2. Android之ListView优化
  3. 洛谷 - P2181 - 对角线 - 打表 - 组合数学
  4. 如何将文件拷贝服务器上,如何将文件复制到云服务器上
  5. 【AI视野·今日CV 计算机视觉论文速览 第217期】Thu, 10 Jun 2021
  6. 数字逻辑要不要认真学_认真认真
  7. linux中dns超时时间,Linux DNS timeout, attempts.---DNS超时,重试的配置
  8. akamai 指纹 和 akamai BMP 移动端sensor 风控分析
  9. 冯诺依曼体系结构与计算机基本组成
  10. 服务器系统安装ansys,云服务器安装ansys
  11. 基于FPGA板的音乐盒的设计
  12. 当前 .NET SDK 不支持将 .NET Core 2.2 设置为目标。请将 .NET Core 2.1 或更低版本设置
  13. html5 mp4转换ogv格式,如何将mp4视频转换成ogv高清视频呢
  14. Word2Vec 源码
  15. Python笔记_81_结算页面_订单模型_优惠券
  16. 数据结构与算法(十一)Trie字典树
  17. 带你玩转区块链--以太坊基础、发币、基于智能合约实现彩票项目-第二章-第一节【以太坊篇】
  18. 基于协同过滤的算法 图书推荐系统
  19. nodejs+ffmpeg视频转码
  20. 操作系统—存储器管理

热门文章

  1. React-Native集成dva.js
  2. esp32-智能语音-mp3(sdcard)
  3. 首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。(已完善)...
  4. System V 共享内存区
  5. 我是如何战胜懒惰的?
  6. 深入学习GridBagLayout
  7. *为需要读写VRML(.wrl)文件的同志们指点一条路
  8. 1.maven下仅shiro框架对shiro的测试使用
  9. javascript时间戳转换成yyyy-MM-DD格式
  10. Java web切面编程