×
Namespaces

Variants
Actions

(译)Nokia Imaging SDK — 核心原则

From Nokia Developer Wiki
Jump to: navigation, search

本文为翻译内容,原文链接在底部

SignpostIcon XAML 40.png
WP Metro Icon WP8.png
Article Metadata

测试基于
SDK: Windows Phone 8.0 SDK, Nokia Imaging SDK Beta 1

兼容于
文章
段博琼 在 11 Oct 2013 创建
最后由 hamishwillee 在 17 Oct 2013 编辑

Contents

简介

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 对象中。

[[File:NokiaImagingSDK filters.jpg]


非常的简单!我们看一下创建的 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: F52f209d183.jpg

类库

在使用 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

Version Hint

Windows Phone: [[Category:Windows Phone]]
[[Category:Windows Phone 7.5]]
[[Category:Windows Phone 8]]

Nokia Asha: [[Category:Nokia Asha]]
[[Category:Nokia Asha Platform 1.0]]

Series 40: [[Category:Series 40]]
[[Category:Series 40 1st Edition]] [[Category:Series 40 2nd Edition]]
[[Category:Series 40 3rd Edition (initial release)]] [[Category:Series 40 3rd Edition FP1]] [[Category:Series 40 3rd Edition FP2]]
[[Category:Series 40 5th Edition (initial release)]] [[Category:Series 40 5th Edition FP1]]
[[Category:Series 40 6th Edition (initial release)]] [[Category:Series 40 6th Edition FP1]] [[Category:Series 40 Developer Platform 1.0]] [[Category:Series 40 Developer Platform 1.1]] [[Category:Series 40 Developer Platform 2.0]]

Symbian: [[Category:Symbian]]
[[Category:S60 1st Edition]] [[Category:S60 2nd Edition (initial release)]] [[Category:S60 2nd Edition FP1]] [[Category:S60 2nd Edition FP2]] [[Category:S60 2nd Edition FP3]]
[[Category:S60 3rd Edition (initial release)]] [[Category:S60 3rd Edition FP1]] [[Category:S60 3rd Edition FP2]]
[[Category:S60 5th Edition]]
[[Category:Symbian^3]] [[Category:Symbian Anna]] [[Category:Nokia Belle]]

This page was last modified on 17 October 2013, at 03:44.
157 page views in the last 30 days.