Windows Phone

在 Windows Phone 8 中对 Nokia Sketch Effect 进行编程

Srikar Doddi

下载代码示例

诺基亚最近发布了诺基亚成像 SDK beta 版中,让 Windows Phone 8 开发人员能够创建先进成像经验为诺基亚 Lumia 智能手机。

诺基亚成像 SDK 包括用于操作图像捕获和存储由 Windows Phone 设备库。其功能包括解码和编码的 JPEG 图像、 应用滤镜和效果、 裁剪、 旋转和调整大小。诺基亚成像 SDK 提供超过 50 预制的滤镜和效果。你可以不只应用效果如棕褐色、 卡通、 素描,等等,但也适用自动增强、 亮度控制、 色相、 饱和度和更多。SDK 已专门为移动影像技术,以作为关键驱动程序的速度和内存性能。

在本文中,我将演示素描效果通过称为纸质照片的示例应用程序的使用。素描效果应用于实时取景器流,并且提供用户捕获图像,并将它们保存到手机的相机胶卷的能力。我开发这个应用程序使用 Visual Studio 2012、 诺基亚成像 SDK 和 Windows Phone 8 SDK。我用诺基亚 Lumia 920 智能手机来对它进行测试。

诺基亚成像 SDK 基础知识

诺基亚成像 SDK 创建由诺基亚给你一个强大的图像处理库的完全访问权限的工具,帮助您伟大的成像应用程序快速轻松地创建。如所述,此 SDK 旨在提供高性能和低内存使用铭记,这是重要的因为微软和诺基亚正在努力创建下一代设备如诺基亚 Lumia 1020。在诺基亚的成像应用程序中,创意工作室已使用 SDK。SDK 和图书馆备有免费的 (请参阅许可协议在 bit.ly/130tVHJ),和 SDK 目前支持仅 Windows Phone 8 应用程序。

诺基亚成像 SDK 提供了以下功能:

  • 使用简单的 API,可用两个从托管的代码,以及本机代码。这意味着作为 Windows Phone 运行时库提供了 SDK,你可以从 C#、 Visual Basic 或 c + + 调用库的方法。API 来与一系列的类和各种成像任务的方法。
  • RAJPEG 技术访问图像数据不首先,解码整个的 JPEG 图像的情况下,允许速度很快预览,效果、 裁剪和旋转的高分辨率图像的应用程序。
  • 50 多个筛选器、 效果和增强功能。一些这些增强功能允许您以编程方式调整 RGB 级别、 色相、 饱和度和亮度。您还可以创建自定义效果和滤镜如果需要。除了这些滤镜和效果,SDK 还允许为裁剪、 旋转和调整大小与无限的撤消功能。
  • 几个全功能的示例应用程序允许您浏览源代码和发现的 sdk 功能。例子包括一系列的筛选器属性的实时处理和在照片中的几个筛选器图层应用等功能。
  • 快速启动指南、 示例项目、 API 参考指南与提供的一些创建图像处理应用程序所需的核心概念概述的几个文档的丰富文献。

开始使用

在高级别上,我为以下从诺基亚成像 SDK Api 用于我的示例应用程序:

  • Nokia.Graphics
  • Nokia.Graphics.Imaging
  • Nokia.InteropServices.WindowsRuntime

Nokia.Graphics.Imaging API 包含诺基亚成像 SDK,其中包括所有的图像筛选器、 图像效果、 JPEG 编码器和解码器的核心功能。Nokia.InteropServices.WindowsRuntime 库内部使用,所需的库,需要在您的项目中引用。它包含一个名为 BufferFactory,用于创建实例的 IBuffer 类。可以在 Visual Studio 中使用 NuGet 包管理器安装此 SDK。您可以通过搜索 NokiaImagingSDK 找到包。

这个应用程序的对象图基本上包括三个关键类,所示的图 1。首页是典型的手机 app 页面的 XAML 文件和一个 C# 对应的执行的。此主页类实现应用程序用户界面,其中包括 MediaElement 显示相机的取景器与素描效果。首页类还拥有其他关键的两个类的实例:CameraStreamSource 和 NokiaSketchEffect。CameraStreamSource,源自 MediaStreamSource,提供相机数据,和 NokiaSketchEffect 实现素描效果。CameraStreamSource 是由诺基亚实现的类并提供给开发人员通过该公司的 app 样品在诺基亚成像 SDK。


图 1 纸照片项目的类关系图

对象图中所示的代码组织到转换为图 2


图 2 Visual Studio 解决方案结构

定义您的用户界面

此应用程序的用户界面非常简单,如中所示图 3。主页面显示的图像从取景器和带有应用程序栏中有一个按钮来捕获与草绘模式效果的照片。


图 3 纸质照片 UI

图 4 演示使用网格元素定义用于显示取景器与应用的素描效果的容器的主页面的 XAML 标记。

图 4 为主营的 XAML 标记页

 

<Grid x:Name="LayoutRoot" Background="Transparent">
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
  </Grid.RowDefinitions>
  <Grid Grid.Row="1" Margin="8">
    <Grid x:Name="MediaElementContainer" Margin="0"></Grid>
      <StackPanel
        x:Name="TitlePanel"
        Grid.Row="0"
        Margin="12,17,0,28">
        <TextBlock
          Text="{Binding Path=LocalizedResources.ApplicationTitle,
          Source={StaticResource LocalizedStrings}}"
          Style="{StaticResource PhoneTextNormalStyle}"
          Margin="12,0"/>
      </StackPanel>           
    </Grid>
  </Grid>

使用中所示的标记生成的应用程序栏图 5。 正如您所看到的它定义了一个捕获按钮和关于菜单项。 捕获按钮是与处理 click 事件的事件处理程序相关联。

图 5 应用程序栏标记

<phone:PhoneApplicationPage.ApplicationBar>
  <shell:ApplicationBar Opacity="0.4">
    <shell:ApplicationBarIconButton x:Name="CaptureButton"
      Text="Capture" IconUri="Assets/capture-button-icon.png"
      Click="CaptureButton_Click" IsEnabled="True" />
    <shell:ApplicationBar.MenuItems>
      <shell:ApplicationBarMenuItem
        Click="OnAboutPageButtonClicked" Text="about" />
    </shell:ApplicationBar.MenuItems>
  </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

Windows Phone 使用功能驱动的安全模型。 此模型允许用户选择在允许某些功能被激活。 在我的演示应用程序,下面的功能需要为用户启用:

  • ID_CAP_ISV_CAMERA:这提供了访问 (主) 后, 置摄像头或前置摄像头。
  • ID_CAP_MEDIALIB_PHOTO:这提供了只读访问到媒体库中的照片。 它还使应用程序能够将照片保存在相机胶卷中。 我将演示这种能力在本文稍后将应用素描效果后保存到相机胶卷的一张照片。

硬件要求,在 app 要求后方摄像头能正常运作。 选择 ID_REQ_REARCAMERA 选项以防止应用程序在无后置摄像头的手机上安装。

将实时素描效果应用到相机的取景器

NokiaSketchEffect 类负责将实时素描效果应用到相机的取景器。 请注意,使用 SketchMode.Gray,在我的应用程序中获取所需的效果。 Get­CameraStreamSource 类中的 SampleAsync 函数是负责处理摄像机缓冲区使用素描效果,和它提供的媒体元素与缓冲区。 GetSampleAsync 方法使用诺基亚­SketchEffect.GetNewFrameAndApplyEffect 方法来获取修改的相机缓冲区。 中的代码图 6 显示它如何执行。

图 6 获取修改的相机缓冲区

public async Task GetNewFrameAndApplyEffect(IBuffer processedBuffer)
{
  if (captureDevice == null)
  {
    return;
  }
  captureDevice.GetPreviewBufferArgb(cameraBitmap.Pixels);
  Bitmap outputBtm = new Bitmap(
    outputBufferSize,
    ColorMode.Bgra8888,
    (uint)outputBufferSize.Width * 4,
    processedBuffer);
  EditingSession session = 
    new EditingSession(cameraBitmap.AsBitmap());
  session.AddFilter(FilterFactory.CreateSketchFilter(SketchMode.Gray));
  await session.RenderToBitmapAsync(outputBtm);
}

在函数中的 captureDevice 是一个私人的照片变量­CaptureDevice 类在 Windows.Phone.Media.Capture 中找到。 RenderToBitmapAsync 函数提供由诺基亚成像 SDK 支持 EditingSession 的异步呈现为位图。 EditingSession 是一个重要的类提供的诺基亚成像 SDK 来表示图像处理编辑会话。 EditingSession 对象是此 SDK 的核心。 在典型的工作流程,EditingSession 从图像创建、 滤镜或效果添加到此届会议上,EditingSession 然后呈现为位图或到内存缓冲区中,和最后关闭 EditingSession。 中的代码图 6 显示了如何创建一个新的位图与 processedBuffer 参数关联、 素描效果应用于它和它然后呈现到新的缓冲区。 最后,CreateSketchFilter 方法可生成草绘图像的外观。 此函数采用 SketchMode — — 一个枚举,— — 作为参数传递的素描筛选器模式。 可用的两个模式是灰色用于在灰度素描和草绘中的颜色的颜色。 正如您所看到的我以前在 SketchMode.Gray 图 6 的代码。 这使纸质照片应用程序来生成图像的灰度。

捕获并将图片保存为 JPEG 图像到相机胶卷

到目前为止我展示如何将实时素描效果应用到取景器。 现在我来看看捕获来自取景器的图片,然后在设备上保存到相机胶卷。 捕捉功能第一次启动自动对焦,然后捕获一张照片。 除了处理从应用程序栏的捕获功能,您还可以处理由硬件设备触发器启动捕获。

在所示的代码图 7 允许捕获通过照相机按钮。 更具体地说,该函数启用或禁用硬件快门释放功能。 CameraButtons 类提供由设备快门按钮触发的事件。 这样一个事件是 ShutterKeyHalfPressed 事件,当硬件快门按钮是按下并保持大约 800 毫秒时触发。 另一个事件是 ShutterKeyPressed 事件。 当硬件快门按钮接收一个完整的新闻时,将发生此事件。 SetCameraButtonsEnabled 函数还处理这些事件处理程序,以帮助释放的内存,与相关的相机的去除。

图 7 启用捕获通过照相机按钮

private void SetCameraButtonsEnabled(bool enabled)
{
  if (enabled)
  {
    Microsoft.Devices.CameraButtons.ShutterKeyHalfPressed
      += ShutterKeyHalfPressed;
    Microsoft.Devices.CameraButtons.ShutterKeyPressed
      += ShutterKeyPressed;
  }
  else
  {
    Microsoft.Devices.CameraButtons.ShutterKeyHalfPressed
      -= ShutterKeyHalfPressed;
    Microsoft.Devices.CameraButtons.ShutterKeyPressed
      -= ShutterKeyPressed;
  }
}

现在我来解释捕获进程的详细信息。 在代码中所示图 8,相机对象表示的照片捕获设备,等待相机。FocusAsync 函数启动自动对焦和 StartCaptureAsync 方法捕获的帧。 但是,您可以捕获帧之前,你需要准备捕获序列。 调用 PrepareCaptureSequenceAsync 可做到这一点。 此外创建捕获序列对象用一个框架,您可以看到从照相机。CreateCaptureSequence(1)。 值 1 指示您启动捕获后,立即将捕获的帧数。 最后,您还指定相机属性和照片设置使用 KnownCameraPhotoProperties 方法。 LockedAutoFocusParameters 设置为 None,表明这一重点,曝光和白平衡设置将自动调整之前捕获。

图 8 捕获过程

private async System.Threading.Tasks.Task Capture()
{
  try
  {
    await camera.FocusAsync();
    MemoryStream imageStream = new MemoryStream();
    imageStream.Seek(0, SeekOrigin.Begin);
    CameraCaptureSequence sequence = camera.CreateCaptureSequence(1);
    sequence.Frames[0].CaptureStream = imageStream.AsOutputStream();
    await camera.PrepareCaptureSequenceAsync(sequence);
    await sequence.StartCaptureAsync();
    camera.SetProperty(
      KnownCameraPhotoProperties.LockedAutoFocusParameters,
      AutoFocusParameters.None);
    ...
}

最后,下面的代码演示如何将捕获的图片保存到相机胶卷:

MediaLibrary library = new MediaLibrary();
EditingSession session =
  new EditingSession(imageStream.GetWindowsRuntimeBuffer());
using (session)
{
  session.AddFilter(FilterFactory.CreateSketchFilter(SketchMode.Gray));
  IBuffer data = await session.RenderToJpegAsync();
  library.SavePictureToCameraRoll(FileNamePrefix
    + DateTime.Now.ToString() + ".jpg",
    data.AsStream());
}

MediaLibrary 类提供的 Microsoft.XNA.Framework.Media API,并用于将照片保存到手机的媒体库。 Microsoft.XNA.Framework.Media 命名空间包含类,以枚举、 播放和查看歌曲、 专辑、 播放列表和图片。 你然后使用诺基亚成像 SDK 中的 EditingSession 类从压缩的图像缓冲区创建一个会话,然后在将图片保存到相机胶卷使用 SavePictureToCameraRoll 函数之前应用的素描效果筛选器。

镜头选取器集成

在 Windows Phone 8,您可以创建一个富媒体镜头,从内置摄像头应用程序打开和取景器的经验引入启动您的应用程序的权利。 为了使镜头的经验,这款应用程序需要注册 Camera_Capture_App 扩展名。 此扩展声明到 OS 的纸质照片应用程序可以显示取景器,当它从镜头选取器启动。 在 WMAppManifest.xml 文件中指定的扩展名。 您需要使用文本编辑器打开此文件:右击该文件,然后选择"打开与...|文本编辑器"。在标记元素,里面的扩展元素之后只是, 镜头扩展是用下面的扩展元素指定的:

<Extension ExtensionName="Camera_Capture_App"
  ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5631}"
  TaskID="_default" />

现在您的应用程序已完成与镜头集成,可以将图片的权利在设备上保存到相机胶卷。 中的图像图 9 内置摄像头应用程序和中的图像采取图 10 采取纸质照片 app 使用素描效果。

A Regular Image Taken with the Built-in Camera App
图 9 定期图像采取与内置摄像头应用程序

An Image Taken Using the Paper Photo App Using the Sketch Effect
图 10 图像采取使用纸照片应用程序使用素描效果

添加您自己的功能

在本文中,我从微软和全新诺基亚成像 SDK 来创建丰富的影像经验探讨照片捕获的 Api。 然后我素描效果应用于实时取景器捕获照片和保存在设备相机胶卷上。 正如您所看到的有的功能,您现在可以使用诺基亚成像 SDK,这使它容易地构建应用程序这种由于吨。 几个次要的细节被省去了为简洁起见,但你可以参考代码下载 (github.com/Srikar-Doddi/PaperPhoto) 为一个完整的理解。 这只是一个例子使用诺基亚成像 SDK 的但有很多的其他功能,您可以添加和的可能性是无限。 我希望你作为起始点使用此代码,将更多的功能添加到此应用程序。

Srikar Doddi 是在卡普兰测试筹备工程的执行董事您可以在介质上找到他的文字 medium.com/@SrikarDoddi。他也是为 Windows Phone 8 Simplist、 DateTileScheduler 和纸质照片的应用程序和 Windows 8 的代言人和 Dabble 应用程序的创建者。 您可以通过电子邮件在到达 Doddi srikar.doddi@gmail.com

衷心感谢以下技术专家对本文的审阅:兰斯麦卡锡 (诺基亚)
兰斯麦卡锡是诺基亚大使和 Telerik XAML 支持专家 (ext-lance.mccarthy@nokia.com)