简介

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. java Class的 getSuperclass与getGenericSuperclass区别

    Class的getInterfaces与getGenericInterface区别 http://www.cnblogs.com/maokun/p/6773076.html 一.getSupercla ...

  2. ECShop 2.x 3.0代码执行漏洞分析

    0×00 前言 ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店.2.x版本跟3.0版本存在代码执行漏洞. 0×01 漏洞原理 ECShop 没有对 $GLOBAL[‘_SE ...

  3. MFC【6】文件I/O和串行化

    文件输入和输出(I/O)服务是所有操作系统的主要工作.Microsoft Windows提供了各种API函数用来读.写和操作磁盘文件.MFC将这些桉树和CFile类融合在面对对象的模型里.其中CFil ...

  4. RecyclerView 数据刷新的几种方式 局部刷新 notify MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 如何:创建签名的友元程序集(C# 和 Visual Basic)

    如何:创建签名的友元程序集(C# 和 Visual Basic) Visual Studio 2013    本示例演示了如何将友元程序集和具有强名称的程序集一起使用. 这两种程序集必须都使用强名称. ...

  6. Install Visual Studio Tools for Apache Cordova

    Install Visual Studio Tools for Apache Cordova Visual Studio 2013   This article refers to the Visua ...

  7. C#基础视频教程4.2 如何编写简单的计算器

    用过VB6或者早期代码的人都应该能感觉到,C#目前也没看出来有什么特别之处,所谓的面向对象也没有什么体现.所以我们需要在原有基础上重写一份代码,然后比较两种做法的优缺点.我们在项目上右击添加一个Fun ...

  8. WCF 之 数据契约

    前面几篇讲的都只能传递string类型的简单参数,数据契约就是用来解决如传递一个带有多个属性的Class类型的对象的. WCF推荐使用数据契约的方式实现数据的序列化.这部分的内容很好理解但是很重要,先 ...

  9. Android应用开发相关下载资源(2014/12/14更新)

    官方终于发布了Android Studio正式版,Android Studio将会成为推荐使用的主要Android开发工具. (1)Android SDK (Android SDK主安装包,包含SDK ...

  10. Tomcat 改服务器编码(Java 修改字符串编码格式)

    对于客户端发来的汉字,我们一般需要转码: ------------------------------------------------------------------------------- ...