Главная » Разработка для Windows Phone 7 » Захват изображения с камеры

0

Кроме встраивания растровых изображений в приложение или их загрузки через Веб, Windows Phone 7 позволяет также использовать изображения со встроенной камеры.

Приложение не может управлять самой камерой. Из соображений безопасности нельзя допускать, чтобы программа просто произвольно делала снимок или могла «увидеть», что находится в области видимости камеры. Поэтому приложение, по сути, вызывает стандартную утилиту работы с камерой, пользователь выбирает вид и делает снимок, и изображение передается в приложение.

Используемые для этого классы находятся в пространстве имен Microsoft.Phone.Tasks. В этом пространстве имен имеется несколько классов – задач, называемых Задачи выбора (choosers) и Задачи выполнения (launchers). Концептуально, эти классы очень похожи, но задачи выбора возвращают данные в приложение, а задачи выполнения нет.

Класс CameraCaptureTask (Задача по захвату изображения с камеры) наследуется от универсального класса ChooserBase (Базовая задача выбора), который определяет событие Completed (Завершен) и метод Show (Показать). Приложение описывает обработчик события Completed и делает вызов Show. Когда вызывается обработчик события Completed, аргумент события PhotoResult (Полученная фотография) содержит объект Stream для фотографии. С этого момента мы уже знаем, что делать.

Как и предыдущие приложения данной главы, SilverlightTapToShoot имеет файл MainPage.xaml, включающий сетку для содержимого с элементом Image. Рассмотрим файл выделенного кода полностью:

Проект Silverlight: SilverlightTapToShoot Файл: MainPage.xaml.cs

using System.Windows.Input; using System.Windows.Media.Imaging; using Microsoft.Phone.Controls; using Microsoft.Phone.Tasks;

namespace SilverlightTapToShoot {

public partial class MainPage : PhoneApplicationPage {

CameraCaptureTask camera = new CameraCaptureTask();;

public MainPage() {

InitializeComponent();

camera.Completed += OnCameraCaptureTaskCompleted;

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs

args)

{

camera.Show();

args.Complete();

args.Handled = true;

base.OnManipulationStarted(args);

}

void OnCameraCaptureTaskCompleted(object sender, PhotoResult args) {

if (args.TaskResult == TaskResult.OK) {

BitmapImage bmp = new BitmapImage(); bmp.SetSource(args.ChosenPhoto); img.Source = bmp;

}

}

}

}

Это приложение можно выполнить на эмуляторе телефона. Если коснуться экрана эмулятора, вызов Show инициирует задачу по работе с камерой, и выполняется переход на страницу, которая напоминает реальную камеру. «Сделать снимок» можно, коснувшись значка в верхнем правом углу экрана. (Условное «фото» – это просто большой белый квадрат с небольшим черным квадратом возле одной из кромок.) После этого необходимо щелкнуть кнопу Accept (Принять).

Также это приложение, безусловно, может быть выполнено на самом телефоне; при этом телефон не должен быть подключен к ПК с выполняющимся настольным ПО Zune. С помощью Visual Studio разверните приложение на телефон и, прежде чем тестировать его, закройте ПО Zune.

Чтобы выполнить в Visual Studio отладку использующего камеру приложения, которое развернуто на телефоне, можно применить небольшую программу, выполняющуюся в режиме командной строки, под названием WPDTPTConnect32.exe или WPDTPTConnect64.exe (в зависимости от того, ведется ли разработка в 32- или 64-разрядной системе). Эти

программы являются альтернативой ПО Zune, и благодаря им отладчик Visual Studio может управлять приложением, хотя оно и выполняется на телефоне. Прежде чем использовать эти программы, закройте ПО Zune.

В любом случае, по нажатию кнопки Accept камера закрывается и выполняется метод OnCameraCaptureTaskCompleted (После завершения задачи по захвату изображения с камеры). Он создает объект BitmapImage, берет значение входящего потока из args.ChoosenPhoto и присваивает объект BitmapImage элементу Image, который будет выводить фотографию на экран.

Процесс в целом кажется довольно простым. Концептуально программа вызывает процесс камеры и затем по его завершении возобновляет выполнение.

Но документация по Windows Phone 7, с которой я ознакомился, предупреждает, что все не совсем так. Происходит еще кое-что, что не так очевидно на первый взгляд и что может лишить присутствия духа.

После того как вызван метод Show объекта CameraCaptureTask, приложение SilverlightTapToShoot завершается. (Но не сразу. Метод OnManipulationStarted может вернуть значения в приложение, и формируется еще пара событий, но после этого приложение абсолютно точно завершается.)

Выполняется утилита работы с камерой. Когда она завершается, происходит повторный запуск SilverlightTapToShoot, создается новый экземпляр приложения. Выполнение начинается с самого начала, вызывается конструктор MainPage, который связывает событие Completed класса CameraCaptureTask с методом OnCameraCaptureTaskCompleted, после чего вызывается этот метод.

По этим причинам документация рекомендует при использовании задачи выбора или выполнения, такой как CameraCaptureTask, определять объект как поле и включать обработчик события Completed в конструктор приложения. Кроме того, обработчик должен располагаться в конструкторе максимально близко к концу, поскольку он будет вызываться при повторном запуске программы.

Такое завершение и повторное выполнение приложения свойственно разработке для Windows Phone 7 и получило название захоронение (tombstoning). Когда приложение завершается, потому что начинается обработка задач работы с камерой, операционная система телефона сохраняет значительный объем сведений, чтобы запустить приложение снова после завершения работы с камерой. Тем не менее, удерживаемых данных не достаточно для полного восстановления приложения в состояние, в котором оно было до «захоронения». За это отвечает разработчик.

Использование задач запуска или выбора – это лишь один из примеров, когда захоронение имеет место. Также оно происходит, когда пользователь покидает приложение, нажимая кнопку Start телефона. Через некоторое время пользователь может вернуться в приложение, нажав кнопку Back, и программе придется повторно запуститься из состояния захоронения. Также захоронение выполняется, когда отсутствие деятельности на телефоне приводит к его блокировке.

Если приложение выполняется, и пользователь нажимает кнопку Back, происходит не захоронение, а обычное завершение приложения.

При захоронении, очевидно, требуется сохранять данные состояния приложения, чтобы его можно было восстановить при повторном запуске. Несомненно, Windows Phone 7 предлагает специальные возможности для этого, что будет рассмотрено в главе 6.

Несмотря на все вышесказанное, в последних версиях операционной системы Windows Phone 7, включая ту, которую я использую при работе над данной книгой, применение CameraCaptureTask не обеспечивает захоронения. Но никогда не помешает подготовиться заранее.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии