Sử dụng hiệu ứng trong Nokia Imagine Sdk

I.Introduction

Ở bài trước mình đã chia sẽ về cách cài đặt Nokia Imagine Sdk, giúp cho các bạn có thể cài và built ứng dụng

Trong bài này mình xin chia sẻ cách sử dụng hiệu ứng trong Nokia Imagine Sdk đối với một hình ảnh được chọn từ MediaLibrary

II.Fundamental

Trước tiên chúng ta tạo một Windows Phone Application Project. sau đó Design giao diện gồm một Grid và 1 ApplicationBarIconButton.

   1: <phone:PhoneApplicationPage.ApplicationBar>

   2:        <shell:ApplicationBar IsMenuEnabled="False"

   3:                              Opacity="0.7">

   4:            <shell:ApplicationBarIconButton IconUri="/Images/image_icon.png"

   5:                                            Text="Cartoon"

   6:                                            Click="ApplyCartoonFilterClick" />

   7:        </shell:ApplicationBar>

   8:    </phone:PhoneApplicationPage.ApplicationBar>

   9:  

  10:    <Grid x:Name="LayoutRoot"

  11:          Background="Transparent">

  12:        <Grid.RowDefinitions>

  13:            <RowDefinition Height="50" />

  14:            <RowDefinition />

  15:        </Grid.RowDefinitions>

  16:  

  17:        <Image x:Name="ImageSample"

  18:               Grid.RowSpan="2" />

  19:  

  20:        <Grid Background="#B2000000">

  21:            <TextBlock Text="Nokia Imaging - Filters"

  22:                       Style="{StaticResource PhoneTextNormalStyle}"

  23:                       Margin="0"

  24:                       HorizontalAlignment="Center"

  25:                       VerticalAlignment="Top" />

  26:        </Grid>

  27:  

  28:    </Grid>

Giao diện này dùng để hiển thị hình ảnh sau khi chọn từ thư viện và từ đó khi chọn vào Button sẽ kích hoạt hiệu ứng và thay đổi hình ảnh hiện tại.

Sau khi làm giao diện xong chúng ta chọn Add References để thêm thư viện Nokia Imagine Sdk vào Project

Vào MainPage.xaml.cs để tiến hành xử lý

Đầu tiên chúng ta khai báo namespace để sử dụng các thao tác trên Nokia Imagine Sdk:

using Microsoft.Phone.Controls;

using Nokia.Graphics.Imaging;

using Microsoft.Phone.Tasks;

 

using System.IO;

using System.Windows.Media.Imaging;

using System.Runtime.InteropServices.WindowsRuntime;

using Windows.Storage.Streams;

Tiếp theo khai báo một số biến toàn cục để thao tác và lưu trữ :

EditingSession editingSession;

MemoryStream imageStream;

protected IBuffer buffer;

double imageWidthPreview;

double imageHeightPreview;

Để chọn hình ảnh từ MediaLibrary thì đơn giản nhất là chúng ta dùng PhotoChooser

Task (các bạn có thể tự viết thông qua MediaLibrary nhé).

Kế tiếp vào contructor MainPage() để khai báo PhotoChooser

Task và khai báo sự kiện Completed cho nó :

   1: public MainPage()

   2: {

   3:     InitializeComponent();

   4:  

   5:     var photoChooserTask = new PhotoChooserTask();

   6:     photoChooserTask.Completed += PhotoChooserTaskCompleted;

   7:     photoChooserTask.Show();

   8: }

Bây giờ xử lý sự kiện PhotoChooserTaskCompleted, khi chọn ảnh xong, chúng ta cần quan tâm 2 vấn đề :

  • Một là render hình ảnh đã chọn ra giao diện để hiển thị cho người dùng xem
  • Hai là copy và lưu trữ stream của ảnh vừa chọn, để khi chúng ta apply hiệu ứng vào được dể dàng
   1: private void PhotoChooserTaskCompleted(object sender, PhotoResult e)

   2:   {

   3:       if (e.TaskResult == TaskResult.OK)

   4:       {

   5:           var bmp = new BitmapImage();

   6:           bmp.SetSource(e.ChosenPhoto);

   7:           ImageSample.Source = bmp;

   8:  

   9:           imageStream = new MemoryStream();

  10:           var bitmap = new WriteableBitmap(bmp.PixelWidth, bmp.PixelHeight);

  11:          

  12:           try

  13:           {

  14:               // For JPEG images

  15:               bitmap.LoadJpeg(e.ChosenPhoto);

  16:               e.ChosenPhoto.Position = 0;

  17:               e.ChosenPhoto.CopyTo(imageStream);

  18:           }

  19:           catch (Exception)

  20:           {

  21:               // For Other Image formats

  22:               BitmapImage image = new BitmapImage();

  23:               image.SetSource(e.ChosenPhoto);

  24:  

  25:               bitmap = new WriteableBitmap(image);

  26:               bitmap.SaveJpeg(imageStream, image.PixelWidth, image.PixelHeight, 0, 100);

  27:           }

  28:  

  29:         

  30:       }

  31:   }

Đến bước này công việc tiếp theo của chúng ta là xử lý sự kiện click của ApplicationBatIconButton để apply một hiệu ứng cho tấm ảnh vừa chọn:

   1: async private void ApplyCartoonFilterClick(object sender, EventArgs e)

   2:    {

   3:        // Lưu lại kích thước ảnh để render sau khi apply hiệu ứng

   4:        imageWidthPreview = ImageSample.ActualWidth;

   5:        imageHeightPreview = ImageSample.ActualHeight;

   6:        

   7:        // Lấy dữ liệu WindowsRuntimeBuffer của tấm ảnh từ MemoryStream

   8:        buffer = imageStream.GetWindowsRuntimeBuffer();

   9:        

  10:        // Khởi tạo EditingSession và chỉ định là Session này apply cho buffer 

  11:        editingSession = new EditingSession(buffer, InputImageFormat.Jpeg);

  12:  

  13:        // thêm hiệu ứng Cartoon cho tấm ảnh

  14:        editingSession.AddFilter(FilterFactory.CreateCartoonFilter(true));

  15:  

  16:        // Gán lại kích thước cho tấm ảnh mới được xử lý

  17:        ImageSample.Width = imageWidthPreview;

  18:        ImageSample.Height = imageHeightPreview;

  19:        

  20:        // Render kết quả ra đối tượng Image ngoài giao diện

  21:        await editingSession.RenderToImageAsync(ImageSample, OutputOption.PreserveAspectRatio);

  22:    }

Các bạn lưu ý những phần mình đã ghi chú cho sự kiện thêm hiệu ứng nhé, nếu làm sai là dể bị crash dữ lắm đó.

Bây giờ chiêm ngưỡng kết quả nào

Capture

Hy vọng bài viết này sẽ hữu ích với các bạn

Leave a comment