Nokia Imaging SDK 是一个 Windows Phone Runtime library 的类库。其中的一个好处就是可以使用
C#、VB 或者 C++ 调用其中的方法。关于更多关于 Windows Phone 运行时的信息可以参考Windows Phone API reference
(MSDN).
这个 EditingSession 对象是这个类库的核心。每次原图片的更改都需要创建一个新的 editing-session 对象,
并且对于需要处理的原图片最好要尽可能长时间的使 editing-session 保持打开来提高性能。一个 session 的使用
通常有以下步骤:
1、为一张图片创建 editing-session 对象
2、为这个 session 添加一个或多个 filters 和 effects
3、这个 editing-session 被生成到一个 bitmap 或者 一个 memory buffer 中
4、根据需求可以重复操作步骤2 和 步骤3
5、关闭 editing-session
通常的关于 editing-session 的代码像下面:
using Nokia.Graphics.Imaging; using (EditingSession editsession = new EditingSession(inputBuffer)) { // First add an antique effect editsession.AddFilter( FilterFactory.CreateAntiqueFilter()); // Then rotate the image editsession.AddFilter( FilterFactory.CreateFreeRotationFilter(35.0f, RotationScaleMode.FitInside) ); // Add more filters here if you want... // Finally, execute the filtering and render to a bitmap await editsession.RenderToBitmapAsync(outputBuffer); }
在这段示例代码中,我们首先用包含原图的 inputBuffer 创建这个 editing-session 对象,然后对这个
editing-session 对象添加一个 古铜色的效果,再旋转 35度。经过滤镜处理后的图片就被生成到 outputBuffer
对象中。
非常的简单!我们看一下创建的 inputBuffer 和 outputBuffer ,SDK 可以接受的 image 可以是
多种类型,包括 JPEG,GIF 和 bitmap。同时输出的格式可以是一个 JPEG buffer 或者一个 bitmap
对于输入和输出的 buffers,这个 SDK 使用它自己的 buffer 类:Nokia.Graphics.Imaging.Bitmap。
虽然开发者可以使用这个 class,这个 SDK 也提供了 helper functions 来抽象这个缓冲区类。
创建 EditingSession
在创建一个 editing-session 对象时,需要体用一个源 image。开发者可以选择使用 encoded data(更小的内存
占用)或者使用一个 bitmap,根据需要选择合适的。EditingSession 类提供了下面三种构造函数:
public EditingSession(Nokia.Graphics.Imaging.Bitmap bitmap); public EditingSession(IBuffer buffer) ; public Session(IBuffer buffer, InputImageFormat format)
public EditingSession(IBuffer buffer, InputImageFormat format)
当读取被编辑的图片文件时,使用这个构造函数。提供的 buffer 通常包含压缩数据(JPEG)
并且可能包含这些像素值的额外信息。
虽然 IBuffer 是 Windows Phone Runtime 内置的类型,但是在 C# 程序中并不常见。
在 C# 程序中,可以使用下面的代码把 MemoryStream 转换成一个 IBuffer:
using System.Runtime.InteropServices.WindowsRuntime; MemoryStream jpegInMemory = new MemoryStream(); // Add your code to load some data into the jpegInMemory buffer... // now convert to an IBuffer IBuffer jpegData = jpegInMemory.GetWindowsRuntimeBuffer(); using (EditingSession editsession = new EditingSession(jpegData))
public EditingSession(Nokia.Graphics.Imaging.Bitmap bitmap)
当被编辑的图片是一个 bitmap 使用这个构造函数。最频繁使用的构造 editing-session 的方式
是使用包含一张图片数据的System.Windows.Media.Imaging.WriteableBitmap。同时 SDK
提供了一个帮助方法 把 WriteableBitmap 转换成一个 Nokia.Graphics.imaging.Bitmap。
别忘了添加 命名空间Nokia.InteropServices.WindowsRuntime。
WriteableBitmap myBitmap = new WriteableBitmap(width, height); // Add your code to load some data into myBitmap // now convert to an Nokia.Ipp.Base.Bitmap Nokia.Graphics.Imaging.Bitmap nokiaBitmap = myBitmap.AsBitmap(); using (EditingSession editsession = new EditingSession(nokiaBitmap))
渲染图片到一个缓冲区
在渲染阶段,图片的 effects 应用到了 session 然后生成了最终的图片。开发者可以选择
生成图片的格式为 JPEG 或者 一个 bitmap。SDK 提供了两种生成图片的方法。
Public IAsyncAction RenderToBitmapAsync(Bitmap renderTarget);
当把输出的图片呈现到屏幕上 或者 获得这个包含图片数据的 buffer 用来做进一步的处理时
可以使用这个方法。在调用方法前,需要用图片的 desired size 初始化生成的目标。
下面是通常如何首先使用 SDK 进行处理,然后显示到 XAML 中的 Image 控件上:
private System.Windows.Controls.Image myImage; // An XAML Image control public async void RenderToScreen () { // Create the output bitmap WriteableBitmap myOutputBitmap = new WriteableBitmap(width, height); // Hook up the WriteableBitmap to a XAML Image control myImage.Source = myOutputBitmap; // Render the image to the bitmap using (EditingSession editsession = new EditingSession(foo)) { await editsession.RenderToBitmapAsync(myOutputBitmap.AsBitmap()); } // Request a redraw myOutputBitmap.Invalidate(); }
Public IAsyncOperation<IBuffer> RenderToJpegAsync();
当输出的类型是 JPEG 的时候可以使用这个方法。这个方法为 buffer 分配所需的内存。
// Render the image as a JPEG using (EditingSession editsession = new EditingSession(foo)) { IBuffer finalJpeg = await editsession.RenderToJpegAsync(); }
裁切
当涉及渲染命令时,开发者可以指定图片裁切的区域,并且只有该区域会使用 effecet。这种
方式在放大一个 JPEG 的时候非常有用。
例如,下面的图片应用了一个 filter effect。开发者只想显示图片的一部分,所以使用了 zooming:
using (EditingSession editsession = new EditingSession(jpegData)) { editsession.AddFilter(FilterFactory.CreateAntiqueFilter()); await editsession.RenderToBitmapAsync(cartoonBitmap.AsBitmap(), OutputOption.PreserveAspectRatio, //保持长宽比 new Windows.Foundation.Rect(200.0, 400.0, 500.0, 500.0)); cartoonBitmap.Invalidate(); }
这个类库只会编码图片裁剪的区域,然后添加 古铜色 effect:
类库
在使用 Nokia Imaging SDK 提供的方法前,必须把 SDK 的类库添加到项目中。两种添加的方法:
使用 Visual Studio NuGet package manager ,或者直接添加到工程的引用。更多信息:Download and add the libraries to the
project.
Nokia WiKi 原文链接:http://developer.nokia.com/Resources/Library/Lumia/#!nokia-imaging-sdk/core-concepts.html