简介

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 = ;
stream_pic_2.Position = ; var filters = new IFilter[]
{
//6f9c87
new ChromaKeyFilter(Windows.UI.Color.FromArgb(0xff, 0x6f, 0x9c, 0x87), 0.3d),//颜色值 和 颜色范围
}; WriteableBitmap writeableBitmap = new WriteableBitmap(, ); // 给图片添加滤镜的管道过程
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 = ;
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(, ),
Windows.UI.Color.FromArgb(, , , )))
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(, ),
Windows.UI.Color.FromArgb(, , , ))

运行代码显示效果:

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(, , , ), Offset = },
//e70aef
new GradientStop() { Color = Windows.UI.Color.FromArgb(0xff, 0xe7, 0x0a, 0xef), Offset = }
}; using(var gradImageSource = new GradientImageSource(new Windows.Foundation.Size(, ), 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

使用 ChromaKey 滤镜进行抠图的更多相关文章

  1. 你值得拥有的Mac PS滤镜插件和特效处理软件合集,不要错过!

    以下几款是Mac上强大的Photoshop滤镜插件和特效,可以让我们更加高效率的使用PS,设计和处理出精美的图片. 1. Alien Skin Eye Candy Eye Candy是一款强大酷炫的P ...

  2. [py]你真的了解多核处理器吗? 了解多线程

    越来越多的人搞爬虫,设计到多线程爬取, 还有一些机器学习的一些模块也需要这玩意, 感觉自己不会逼格不高. 抽时间赶紧玩一玩这东西, 希望提高对软件的认知和归属感,不要太傻. cpu内部架构参考 你知道 ...

  3. photoshop常见抠图方法

    1.多边形套索:这种工具是用于抠图的边界比较平直,但颜色比较复杂类的图像,它也是最笨最无奈的方法,只能是利用鼠标一点一点去点击抠选.2.磁性套索工具:分为三种:套索,多边形,磁性.这类工具一般只用于边 ...

  4. FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM

    FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice t ...

  5. FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照

    1 FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照 2016.02.18 by 1CM 2 T.. = Timeline support 3 支持时间轴 4 .S. = ...

  6. FFMpeg 滤镜中英文对照

    FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照 2016.02.17 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice t ...

  7. EDIUS如何实现抠图

    有时候我们把素材图片导入到EDIUS中会发现图片的背景有点不合适,这时候就会想替换掉这个背景.那么EDIUS也可以像PS一样替换掉背景吗?答案当然是肯定的,现在小编就带领你们一起来学习EDIUS抠图吧 ...

  8. PS抠图神器:KNOCKOUT 2.0

    从优设上转载~~太好用了,保存下来以备不时之需. 本人亲身实践~~先看使用成果~~哈哈~~ 原版图 : 抠过的图: 主要看飘逸的发丝~~~而且全程操作不超过5分钟!! 下载地址: http://vdi ...

  9. iOS8 Core Image In Swift:更复杂的滤镜

    iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用 iOS8 Core Image In Swift:更复杂的滤镜 iOS8 Core Image In Swift:人脸 ...

随机推荐

  1. iOS:转载sqlite3

     SQLITE3 使用总结 2012-08-21 13:48:28 分类: SQLite/嵌入式数据库 SQLITE3 使用总结 2009-09-16 07:36 2624人阅读 评论(10) 收藏  ...

  2. vnstat 查看服务器带宽统计命令

    vnStat是一个Linux下的网络流量监控软件,它记录指定网卡每日的传输流量日志. 它并非基于网络包的过滤,而是分析文件系统- /proc, 所以vnStat无需root的权限就可使用. ,它还自带 ...

  3. java学习笔记10--泛型总结

    java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5-- ...

  4. Mongodb 常用命令2

    1.把一个collection里面的数据复制到另一个collection中,比如category集合中数据备份到category_clone中 db.category.find().forEach(f ...

  5. PHP中多IP段权限控制方案

    在某些项目中我们可能会用到根据IP段进行权限校验,比如不在我们配置的IP段内的用户访问某些页面或功能模块时,将提示其权限不够并禁止访问该页面的内容.鉴于项目中需求各异,下面只说下大致思路以及我个人的实 ...

  6. [转]JavaScript异步机制详解

    原文: https://www.jianshu.com/p/4ea4ee713ead --------------------------------------------------------- ...

  7. (剑指Offer)面试题51:数组中重复的数字

    题目: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7 ...

  8. (剑指Offer)面试题10:二进制中1的个数

    题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 很明显,这道题考察的是位运算. 1.依次将整数右移,判断整数最后一位是否为1(&1): 问题:如果该整数为负数 ...

  9. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  10. Shodan:黑客的物联网搜索引擎

    记得看过一个电影.里面的科学家开发了一个超级系统,能够实时监控全部可用摄像头.让逃犯无处遁形. Shodan这个新型的搜索引擎可能会让这个想法变成现实. 和Google这些传统互联网信息搜索引擎不同. ...