简介

Nokia Imaging SDK  1.0 中新提供的 ChromaKey 滤镜是一个神奇的滤镜,它的基本原理就是把

一个指定范围值内的颜色变为透明或半透明,比如下面的 demo 演示的,看上去第一张照片的两个人物的

拍摄地点由屋子里变成了沙滩:

原理是用 ChromaKey 滤镜把第一张图片的背景色去除,然后用 Blend 滤镜,与第二张图片进行融合,显示结果就是

第三张图片。

由此可以预见,使用这个滤镜,如果背景素材丰富的话,可以提供各种有趣的效果。在其它场景的应用交互中,这个滤镜也是

大有作为的。

步骤:

1)首先在 VS 中新建一个名为  ChromaKeyFilterSample 的解决方案,并且通过 NuGet 添加 Imaging SDK 类库,

具体参照上一篇文章。

2)在工程的根目录下面添加两张图片,作为下面的处理过程的素材:

图片一:

图片二:

3)在 MainPage 的 xaml 页面,添加 三个 Image 控件,分别显示 两张原图和 结果:

 <Image x:Name="pic1" HorizontalAlignment="Left" Height="192" Stretch="Fill" Margin="10,25,0,0" VerticalAlignment="Top" Width="202"/>
 <Image x:Name="pic2" HorizontalAlignment="Left" Height="192" Stretch="Fill" Margin="236,25,0,0" VerticalAlignment="Top" Width="200"/><Image x:Name="imgResult" HorizontalAlignment="Left" Height="450" Margin="10,280,0,0" VerticalAlignment="Top" Width="450"/>

4)在页面的 Loaded 事件中,分别显示两张原图:

        // 存储两张原图片的流
        Stream stream_pic_1;Stream stream_pic_2;async void MainPage_Loaded(object sender, RoutedEventArgs e){// 获取 xap 包中的 图片stream_pic_1 = App.GetResourceStream(new Uri("pic_1.jpg", UriKind.Relative)).Stream;stream_pic_2 = App.GetResourceStream(new Uri("pic_2.jpg", UriKind.Relative)).Stream;BitmapImage bitmap_1 = new BitmapImage();bitmap_1.SetSource(stream_pic_1);pic1.Source = bitmap_1;BitmapImage bitmap_2 = new BitmapImage();bitmap_2.SetSource(stream_pic_2);pic2.Source = bitmap_2;}

显示效果:

为了显示效果明显,把 MainPage 页面的背景色改为了淡蓝色 : Background="AliceBlue"

5)继续在 MainPage_Loaded 页面中添加处理代码。在 PhotoShop 中,用拾色器查看 图片一

的背景色大致为 #6f9c87,然后给图片一运用 ChromaKeyFilter 滤镜:

 stream_pic_1.Position = 0;stream_pic_2.Position = 0;var filters = new IFilter[]{//6f9c87new ChromaKeyFilter(Windows.UI.Color.FromArgb(0xff, 0x6f, 0x9c, 0x87), 0.3d),//颜色值 和 颜色范围
 };WriteableBitmap writeableBitmap = new WriteableBitmap(450, 450);// 给图片添加滤镜的管道过程using (StreamImageSource streamImageSource = new StreamImageSource(stream_pic_1))using (FilterEffect filterEffect = new FilterEffect(streamImageSource) { Filters = filters })using (var renderer = new WriteableBitmapRenderer(filterEffect, writeableBitmap, OutputOption.Stretch)){await renderer.RenderAsync();imgResult.Source = writeableBitmap;}

具体滤镜的使用可以参考 链接

到这里,运行代码显示效果可以看出,图片一 的背景色去除了,显示出了页面的淡白色:

6)这个步骤就是把上一步中,图片一 的处理结果 和 图片二进行融合,继续在 MainPage_Loaded 方法中,

把上面的这行代码注释掉:

// imgResult.Source = writeableBitmap;

然后继续添加 Blend 滤镜。BlendFilter 的一个属性就是指定它的 BitmapImageSource 类型的前景图片,然后

指定两张图片的融合方式:

 var filtersBlend = new IFilter[]{// 为 writeableBitmap.AsBitmap() 方法添加命名空间 Nokia.InteropServices.WindowsRuntime // writeableBitmap 是上一步的处理结果new BlendFilter{ForegroundSource = new BitmapImageSource(writeableBitmap.AsBitmap()), BlendFunction = BlendFunction.Normal }};// 沙滩背景 的流stream_pic_2.Position = 0;using (StreamImageSource streamImageSource = new StreamImageSource(stream_pic_2))using (FilterEffect filterEffect = new FilterEffect(streamImageSource) { Filters = filtersBlend })using (var renderer = new JpegRenderer(filterEffect)){Windows.Storage.Streams.IBuffer buf = await renderer.RenderAsync();Stream stream = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.AsStream(buf);BitmapImage bi = new BitmapImage();bi.SetSource(stream);imgResult.Source = bi;// 显示结果}

运行结果,可以看出,两张照片已经融合到了一起:

到这里,这个神奇的滤镜的讲解就完成了。

7)因为在 Iamging SDK 中,可以通过 ColorImageSource 类,初始化一个纯色背景的图片源,通过它再跟

第一张图片进行融合,就可以改变背景的颜色。把 步骤 6) 上面添加 ”沙滩背景“ 的代码注释掉,添加下面代码,

直接把蓝色背景换成了耀眼的红色:

 // 纯色using (ColorImageSource colorImageSource = new ColorImageSource(new Windows.Foundation.Size(450, 450),Windows.UI.Color.FromArgb(150, 255, 0, 0)))using (FilterEffect filterEffect = new FilterEffect(colorImageSource) { Filters = filtersBlend })using (var renderer = new WriteableBitmapRenderer(filterEffect, writeableBitmap, OutputOption.Stretch)){await renderer.RenderAsync();imgResult.Source = writeableBitmap;}

其中的,下面这行代码的意思是初始化一张 450x450 的背景为红色的半透明的 ImageSource 对象:

ColorImageSource colorImageSource = new ColorImageSource(new Windows.Foundation.Size(450, 450),Windows.UI.Color.FromArgb(150, 255, 0, 0))

运行代码显示效果:

8)另外,在 Imaging SDK 中,还提供了一个  RadialGradient 类,用它可以初始化一个渐变色的 ImageSource 对象,

注释掉 7)中的代码,用下面的代码给 图片一 添加一个紫色的渐变背景色:

 // 渐变色var rad = new RadialGradient(new Windows.Foundation.Point(0.5, 0.9), new EllipseRadius(0.3, 0.3));rad.Stops = new GradientStop[] {new GradientStop() { Color = Windows.UI.Color.FromArgb(255, 0, 0, 0), Offset = 0 },//e70aefnew GradientStop() { Color = Windows.UI.Color.FromArgb(0xff, 0xe7, 0x0a, 0xef), Offset = 1 }};using(var gradImageSource = new GradientImageSource(new Windows.Foundation.Size(450, 450), rad))using (FilterEffect filterEffect = new FilterEffect(gradImageSource) { Filters = filtersBlend })//using (FilterEffect filterEffect = new FilterEffect(gradImageSource))using (var renderer = new WriteableBitmapRenderer(filterEffect, writeableBitmap, OutputOption.Stretch)){await renderer.RenderAsync();imgResult.Source = writeableBitmap;}

工程运行效果:

源代码下载:http://pan.baidu.com/s/1sjpsHVR

代码运行说明:

在运行源代码时,会出现一个编译错误: Nokia Imaging SDK does not support the AnyCPU target platform.

因为 Nokia Imaging SDK 支持托管代码和本地代码,所以在编译前需要进行设置:

1)在模拟器上运行时:菜单 -> 生成 -> 配置管理器 -> 活动解决方案平台 -> x86 2)在真机上运行时:  菜单 -> 生成 -> 配置管理器 -> 活动解决方案平台 -> ARM

更多有关说明请参考: http://developer.nokia.com/Resources/Library/Lumia/#!nokia-imaging-sdk/adding-libraries-to-the-project.html

转载于:https://www.cnblogs.com/hebeiDGL/p/3487236.html

使用 ChromaKey 滤镜进行抠图相关推荐

  1. Photoshop抠图教程8例

    Photoshop抠图教程:用橡皮擦为美女换背景 Photoshop抠图教程:用橡皮擦为美女换背景 来源:天极网 本篇Photoshop教程是典型的PS抠图教程,主要为大家介绍如何使用背景橡皮擦来为美 ...

  2. 刘歧:FFmpeg Filter深度应用

    本文来自OnVideo视频创作云平台联合创始人刘歧在LiveVideoStackCon的讲师热身分享,刘歧分享了FFmpeg的基本原理.使用方法及开发方法.在10月19-20日的LiveVideoSt ...

  3. FFmpeg从入门到精通命令

    第二章 工作使用基础 ffmpeg使用及部分参数 ffprobe 使用及部分参数 ffplay 使用及部分参数 第三章 ffmpeg转封装 MP4 box容器一个套一个 ffmpeg -h demux ...

  4. 从事【音视频】的开发者,看过来,如果记不住FFmpeg命令,可以收藏,不记得的时候,掏出来翻翻

    ffmpeg --help大概分为6个部分,具体如下: ffmpeg信息查询部分 公共操作参数部分 文件主要操作参数部分 视频操作参数部分 音频操作参数部分 字母操作参数部分 查看支持的容器格式 # ...

  5. FFmpeg应用知识介绍

    简介 1.FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件 2.FFmpeg框架基本组成 AVFormat 封装和解封装模块库 如MP4.FLV.KV.TS等文件封装格式,RTM ...

  6. android 图片识别白色区域进行裁剪_【研途技能贴】| 4款好用的图片处理软件推荐...

    要考研啦 4款好用的图片处理软件推荐 01 入门级作图神器--图怪兽 一款会打字就能用的在线编辑器,80万+模板任君挑选~无论是基础的旋转裁剪,还是难度进阶的抠图拼图,在这款软件里,你可以分分钟做出高 ...

  7. 这些AI开源项目可以让你创作出卢浮宫级别的艺术品!

    人工智能越来越渗透到我们的日常生活中了.比如之前新闻报道,人工智能产生的艺术品在佳士得(Christie's)的赞助下登上了世界拍卖的舞台,这不仅仅证明人工智能具有创造性,还可以创作出世界级的艺术品. ...

  8. 图片水印怎么加?图片加水印方法分享

    相信大家在日常生活中,都会在各个平台上分享自己拍摄的照片吧,但大家在收到网友的好评和点赞的同时,是不是会因为担心图片被别人转发或者是拿去做一些不好的事情而感到烦恼呢?其实要解决这个烦恼很简单,那就是给 ...

  9. RGB和YUV颜色对比,使用ffmpeg颜色处理,视频混合,透明度处理

    本文汇总了ffmpeg关于色彩处理和透明度处理的各种滤镜 所有颜色都可以通过3种基本颜色的组合来创建:红色,绿色和蓝色任何颜色表示为混合这三种颜色的各种强度的结果,通常以0到255(256 = 216 ...

最新文章

  1. python字符串/元组/列表/字典互转
  2. 通过邮箱验证注册——.net代码
  3. C++ XML解析之TinyXML篇
  4. CSS弹出二级多列菜单和DIV布局实例 - 仿IBM官网首页
  5. mysql5.5源码包安装_mysql的源码包方式安装(mysql5.5)
  6. 浅谈块级元素和行级元素的相对定位和绝对定位问题
  7. Java 技术小图谱
  8. 计算机控制技术与自动化的关系,计算机控制技术东南大学自动化学院.ppt
  9. 电子计算机职专东校区在哪,自贡计算机电子信息职业技术学校位置在哪儿
  10. oracle中block
  11. android初始化activity时隐藏软键盘
  12. selinux-setroubleshoot安装及详解
  13. 【转】Golang 新手可能会踩的 50 个坑
  14. NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS论文解读
  15. Root Pane Container(三)
  16. 数据库一条insert插入多条记录
  17. 已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题
  18. Java中类、抽象类、接口的联系与区别
  19. 英式音标26字母发音规律
  20. 我们年轻时,为什么要辛苦赚钱,这是我听过的最好回答!

热门文章

  1. web前端黑客技术揭秘(5)
  2. 人工智能眼中的2017全球最美100张面孔(中)
  3. Office365 - 如何查找Yammer Group创建者?
  4. 美国Stadium Goods球鞋海淘详细攻略及如何用虚拟信用卡海淘抢货
  5. 比较出名的几个树莓派论坛
  6. Qz学算法-数据结构篇(排序)
  7. 如何在ubuntu18.04下安装Firefox中国版解决Ubuntu与Windows下Firefox账号同步问题(已解决)
  8. 750W高PF值充电机用电源方案
  9. 新型压电式雨量传感器累计雨量、本场雨量、本场持续雨量、过去一分钟雨量、过去十分钟雨量、本场峰值雨量分钟皆可监测
  10. Linux战地日记——find命令