核心原则

    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

 

 

posted @ 2013-09-12 18:16  博琼  阅读(357)  评论(0编辑  收藏  举报