• 核心原则


        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

  • 相关阅读:
    chartjs 初步
    QT “error: error writing to -: Invalid argument”
    OTL mySQL
    qtcteater pro 文件配置
    Python os.readlink() 方法
    Python os.read() 方法
    Python os.popen() 方法
    Python os.pipe() 方法
    Python os.pathconf() 方法
    ThinkPHP框架前后台的分页调用
  • 原文地址:https://www.cnblogs.com/hebeiDGL/p/3317528.html
Copyright © 2020-2023  润新知