Опубликован: 10.04.2013 | Уровень: для всех | Доступ: платный
Лекция 6:

Списки воспроизведения

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Специальные свойства мультимедиа

Вместе с классом BasicProperties в пространстве имен Windows.Storage.FileProperties мы так же можем найти классы, возвращаемые методами StorageFile.properties.get*PropertiesAsync: ImageProperties, VideoProperties, MusicProperties, и DocumentProperties. Хотя мы и так довольно далеко забрались, чтобы их найти, каждый из них, по-настоящему глубоко, содержит несметные информационные сокровища. Таблицы ниже, в свою очередь, приводят сводные данные по ним. Обратите внимание на то, что объект каждого типа содержит метод retrievePropertiesAsync, похожий на соответствующий метод BasicProperties, который позволяет вам запрашивать дополнительные свойства по имени, которые не включены в свойства основного объекта. Воспользуйтесь ссылками в верхней части таблицы для того, чтобы воспользоваться справочными разделами, которые позвлят обнаружить наиболее подходящие свойства Windows.

Таблица 6.1.
ImageProperties из StorageFile.properties.getImagePropertiesAsync
Дополнительные свойства System.Image, System.Photo, System.Media
Свойство Тип данных Соответствующее свойство Windows
title String System.Title
dateTaken Date System.Photo.DateTaken
latitude Double (смотрите ниже) System.GPS.LatitudeDecimal, мли комбинация System.GPS.Latitude, System.GPS.LatitudeDenominator, System.GPS.LatitudeNumerator, and System.GPS.LatitudeRef
longitude Double (смотрите ниже) System.GPS.LongitudeDecimal, или комбинация System.GPS.Longitude, System.GPS.LongitudeDenominator, System.GPS.LongitudeNumerator, and System.GPS.LongitudeRef
cameraManufacturer String System.Photo.CameraManufacturer
cameraModel String System.Photo.CameraModel
width Количество в пикселях System.Image.HorizontalSize
height Количество в пикселях System.Image.VerticalSize
orientation Windows.Storage.FileProperties.- PhotoOrientation содержит unspecified, normal, flipHorizontal, flipVertical, transpose, transverse, rotate90, rotate180, rotate270 System.Photo.Orientation
peopleNames String vector System.Photo.PeopleNames
keywords String vector System.Keywords
rating Число (1-99 с 0 означающим "нет оценки") System.Rating
Таблица 6.2.
VideoProperties из StorageFile.properties.getVideoPropertiesAsync
Дополнительные свойства System.Video, System.Media, System.Image, System.Photo
Свойство Тип данных Соответствующее свойство Windows
title String System.Title
subtitle String System.Media.SubTitle
year Number System.Media.Year
publisher String System.Media.Publisher
rating Number System.Rating
width Number in pixels System.Video.FrameWidth
height Number in pixels System.Video.FrameHeight
orientation Windows.Storage.FileProperties.- VideoOrientation содержит normal, rotate90, rotate180, rotate270 System.Photo.Orientation
duration Число (в 100-нс единицах, т.е. 1/10th миллисекунды) System.Media.Duration
bitrate Число (в битах в секунду) System.Video.TotalBitrate, System.Video.EncodingBitrate
directors String vector System.Video.Director
producers String vector System.Media.Producer
writers String vector System.Media.Writer
keywords String vector System.Keywords
latitude Double (смотрите ниже) System.GPS.LatitudeDecimal, или комбинация System.GPS.Latitude, System.GPS.LatitudeDenominator, System.GPS.LatitudeNumerator, and System.GPS.LatitudeRef
longitude Double (смотрите ниже) System.GPS.LongitudeDecimal, или комбинация System.GPS.Longitude, System.GPS.LongitudeDenominator, System.GPS.LongitudeNumerator, and System.GPS.LongitudeRef
Таблица 6.3.
MusicProperties из StorageFile.properties.getMusicPropertiesAsync
Дополнительные свойства System.Music, System.Media
Свойство Тип данных Соответствующее свойство Windows
title String System.Title, System.Music.AlbumTitle
subtitle String System.Media.SubTitle
trackNumber Number System.Music.TrackNumber
year Number System.Media.Year
publisher String System.Media.Publisher
artist String System.Music.Artist, System.Music.DisplayArtist
albumArtist String System.Music.DisplayArtist (чтение), System.Music.AlbumArtist (запись)
genre String vector System.Music.Genre
composers String vector System.Music.Composer
conductors String vector System.Music.Conductor
rating Число (1-99 с 0 означающим "нет оценки") System.Rating
duration Число (в 100-нс единицах, т.е. 1/10th миллисекунды System.Media.Duration
bitrate Число (в битах в секунду) System.Video.TotalBitrate, System.Video.EncodingBitrate
producers String vector System.Media.Producer
writers String vector System.Media.Writer
Таблица 6.4.
DocumentProperties from
Дополнительные свойства System
Свойство Тип данных Соответствующее свойство Windows
title String System.Title
Author String vector System.Author
keywords String vector System.Keywords
Comments String System.Comment

Пара замечаний обо всем этом. Во-первых, переменные String vector (строковые векторы) – это, как мы видели ранее, экземпляры IVector (http://msdn.microsoft.com/library/windows/apps/br206631.aspx), который предоставляет методы для манипуляции, наподобие append, insertAt, removeA, и так далее. в JavaScript вы можете получить доступ к членам вектора как к массиву, через квадратные скобки [ ]; следует лишь помнить, что доступные методы более специфичны.

Во-вторых, свойства latitude и longitude для изображений имеют тип данных double, но содержат градусы, минуты, секунды и указание на направление. Пример "Простая работа с изображениями" (http://code.msdn.microsoft.com/windowsapps/Simple-Imaging-Sample-a2dec2b0) (в js/default.js) содержит вспомогательную функцию для извлечения компонентов этих значений и конвертирования их в строку:

"convertLatLongToString": function (latLong, isLatitude) {
var reference;

if (isLatitude) {	
reference = (latLong >= 0) ? "N" : "S";
} else {	
reference = (latLong >= 0) ? "E" : "W";
}	

latLong = Math.abs(latLong);	
var degrees = Math.floor(latLong);	
var minutes = Math.floor((latLong - degrees) * 60);	
var seconds = ((latLong - degrees - minutes / 60) * 3600).toFixed(2);
return degrees + "°" + minutes + "\'" + seconds + "\"" + reference;
}
 

Подводя итоги, знак величины указывает на направление. Положительное значение для широты (latitude) указывает на Север, отрицательное означает Юг, для долготы (longitude) положительное значение означает Восток, отрицательное – Запад. Целая часть числа представляет собой градусы, дробная содержит значение минут, за базу взято 60. Умножение этого значения на 60 дает полное количество минут, то, что остается, содержит секунды. Это может показаться странным, но подобные исходные данные получают от GPS-приемника и API определения местоположения обычно конвертирует их.

Мультимедийные свойства в примерах

Несколько примеров из Windows SDK показывают, как работать с некоторыми из вышеописанных свойств и как работать со свойствами в общем. Пример "Простая работа с изображениями" (http://code.msdn.microsoft.com/windowsapps/Simple-Imaging-Sample-a2dec2b0), в Сценарии 1, предоставляет наиболее полную демонстрацию, так как вы можете выбрать файл изображения и он загрузит и отобразит различные свойства, как показано на рис. 6.2 (я прокрутил список вниз, чтобы показать полный набор свойств). Я могу подтвердить, что дата, производитель и модель камеры, сведения об экспозиции, верны.

Свойства файла изображения в примере "Простая работа с изображениями"

Рис. 6.2. Свойства файла изображения в примере "Простая работа с изображениями"

Метод примера openHandler получает эти свойства из файла, в частности, выполняя вызов StorageFile.properties.getImagePropertiesAsync и используя метод ImageProperties.retrievePropertiesAsync для пары дополнительных свойств уже не в ImageProperties. Затем getImagePropertiesForDisplay объединяет их в единый объект, используемый для вывода данных в пользовательский интерфейс примера. Некоторые строки кода, приведенного ниже, опущены.

var ImageProperties = {};

function openHandler() {
// Хранит данные между асинхронными вызовами. 
var file = {};

Helpers.getFileFromOpenPickerAsync().then(function (_file) {
file = _file;	
return file.properties.getImagePropertiesAsync();	
}).then(function (imageProps) {	
ImageProperties = imageProps;	

var requests = [	
"System.Photo.ExposureTime",    // В секундах	
"System.Photo.FNumber"    // Значение диафрагмы из данных EXIF
};	

return ImageProperties.retrievePropertiesAsync(requests);	
}).done(function (retrievedProps) {	
// Форматирование свойств в виде текста для отображения в интерфейсе.	
displayImageUI(file, getImagePropertiesForDisplay(retrievedProps));
});	
 }	

function getImagePropertiesForDisplay(retrievedProps) {
// Если заданное свойство не существует, его значением будет null.
var orientationText = Helpers.getOrientationString(ImageProperties.orientation);

var exposureText = retrievedProps.lookup("System.Photo.ExposureTime") ?
retrievedProps.lookup("System.Photo.ExposureTime") * 1000 + " ms" : "";

var fNumberText = retrievedProps.lookup("System.Photo.FNumber") ?
retrievedProps.lookup("System.Photo.FNumber").toFixed(1) : "";

// Опущено: код для конвертации ImageProperties.latitude и ImageProperties.longitude в
// градусы, минуты, секунды, и направление

return {
"title": ImageProperties.title,
"keywords": ImageProperties.keywords, // строковой массив
"rating": ImageProperties.rating, // число 
"dateTaken": ImageProperties.dateTaken, 
"make": ImageProperties.cameraManufacturer, 
"model": ImageProperties.cameraModel, 
"orientation": orientationText,
// Опущено: свойства широты/долготы
"exposure": exposureText, 
"fNumber": fNumberText
};
}
 

Функция displayImageUI, которой передаются эти свойства, в основном просто копирует данные в различные элементы управления. Полезно будет снова отметить, однако, что отображение фотографии реализовано с помощью нашего хорошего друга URL.createObjectURL:

function displayImageUI(file, propertyText) {
id("outputImage").src = window.URL.createObjectURL(file, { oneTimeOnly: true });
 

Небольшой пример работы с MusicProperties можно найти в примере "Список воспроизведения" (http://code.msdn.microsoft.com/windowsapps/Playlist-sample-3d80daee), как мы уже видели в разделе "Списки воспроизведения". Вы можете сейчас вернуться назад и взглянуть на код, приведенный в этом разделе, и вы вполне сможете понять, что происходит. В SDK нет примеров использования VideoProperties и DocumentProperties, работа с ними выполняется по тем же шаблонам, как показано выше для ImageProperties, поэтому написание необходимого кода не вызовет затруднений.

Кроме того, взглянем еще раз на пример "Конфигурация кнопок для мультимедиа" (http://code.msdn.microsoft.com/windowsapps/Media-Buttons-ea57d8e2), который мы видели ранее, в разделе "Пользовательский интерфейс управления воспроизведением". Он показывает, как использовать музыкальные свойства для того, чтобы получить изображение альбома.

Что касается сохранения свойств, пример "Простая работа с изображениями" демонстрирует это в Сценарии 1. Так как поля, показаные ранее, на рис. 6.2, можно редактировать, в примере есть кнопка Apply (Применить), которая вызывает функцию applyHandler, показанную ниже, для записи измененных свойств в файл:

function applyHandler() {
ImageProperties.title = id("propertiesTitle").value;

// Ключевые слова хранятся в строковом массиве.
 Разделение строк знаками перевода строки.
ImageProperties.keywords.clear();	
if (id("propertiesKeywords").value !== "") {	
var keywordsArray = id("propertiesKeywords").value.split("\n");	

keywordsArray.forEach(function (keyword) {	
ImageProperties.keywords.append(keyword);
});	
}	

var properties = new Windows.Foundation.Collections.PropertySet();

// При записи оценок, используйте ключ свойства "System.Rating".	
// ImageProperties.rating не обрабатывает значение оценки 0 (нет звезд/оценок).
properties.insert("System.Rating", Helpers.convertStarsToSystemRating(	
id("propertiesRatingControl").winControl.userRating	
));	

// Код опущен: конвертирование дискретных значений широты и
 долготы из пользовательского интерфейса в
// форму, подходящую для свойства, и проверка данных; 
конечный результат этих манипуляций
// сохраняется в списке свойств
properties.insert("System.GPS.LatitudeRef", latitudeRef); properties.insert("System.GPS.LongitudeRef", longitudeRef); 
properties.insert("System.GPS.LatitudeNumerator", latNum); properties.insert("System.GPS.LongitudeNumerator", longNum); 
properties.insert("System.GPS.LatitudeDenominator", latDen);
properties.insert("System.GPS.LongitudeDenominator", longDen);

// Запись массива свойств в файл

ImageProperties.savePropertiesAsync(properties).done(function () {	
// ...	
}, function (error) {	
// Обработка некоторых ошибок и некоторые свойства могут
 не поддерживаться всеми форматами изображений.
});	
}	
 

Несколько примечательных особенностей этого кода перечислены ниже:

  • Он разделяет ключевые слова в элементе управления пользовательского интерфейса и отдельно добавляет каждое к вектору в свойстве keywords.
  • Он создает новую коллекцию свойств типа Windows.Foundation.Collections.PropertySet и использует ее метод insert для добавления свойств в список. Этот набор свойств – именно то, чего ожидает метод savePropertiesAsync.
  • Метод Helpers.convertStartsToSystemRating (смотрите js/default.js) производит конверсию оценки, выраженной в 1 – 5 звездах, как используется в элементе управления WinJS.UI.Rating, в значение System.Rating, которое использует диапазон значений 1 – 99. Документация по System.Rating (http://msdn.microsoft.com/library/bb787554.aspx) особо описывает подобное преобразование.

В итоге, вся детализированная информация, которая нужна вам для любого конкретного свойства Windows, может быть найдена на справочной странице этого свойства. Начать углубленное изучение свойств можно со страницы Свойства Windows (http://msdn.microsoft.com/library/windows/desktop/dd561977.aspx).

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Дмитрий Мельник
Дмитрий Мельник
Беларусь
Сергей Ширяев
Сергей Ширяев
Россия, г. Москва