Беларусь |
Списки воспроизведения
Специальные свойства мультимедиа
Вместе с классом BasicProperties в пространстве имен Windows.Storage.FileProperties мы так же можем найти классы, возвращаемые методами StorageFile.properties.get*PropertiesAsync: ImageProperties, VideoProperties, MusicProperties, и DocumentProperties. Хотя мы и так довольно далеко забрались, чтобы их найти, каждый из них, по-настоящему глубоко, содержит несметные информационные сокровища. Таблицы ниже, в свою очередь, приводят сводные данные по ним. Обратите внимание на то, что объект каждого типа содержит метод retrievePropertiesAsync, похожий на соответствующий метод BasicProperties, который позволяет вам запрашивать дополнительные свойства по имени, которые не включены в свойства основного объекта. Воспользуйтесь ссылками в верхней части таблицы для того, чтобы воспользоваться справочными разделами, которые позвлят обнаружить наиболее подходящие свойства Windows.
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 |
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 |
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 |
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 (я прокрутил список вниз, чтобы показать полный набор свойств). Я могу подтвердить, что дата, производитель и модель камеры, сведения об экспозиции, верны.
Метод примера 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).