Цель лекции: научиться работать с изображениями как в XNA, так и в Silverlight.
Еще одним объектом, который применяется в приложениях на Silverlight и XNA так же широко, как и текст, является растровое изображение. Ранее растровое изображение определялось как двумерный массив битов, соответствующих пикселям графического устройства.
В Silverlight растровое изображение иногда называют просто изображением, но это, главным образом, наследие Windows Presentation Foundation, где изображениями называют и растровые изображения, и векторные рисунки. И в WPF, и в Silverlight элемент Image обеспечивает вывод на экран растровых изображений, но сам не является растровым изображением.
В XNA растровое изображение типа Texture2D и, следовательно, часто называется текстурой, но этот термин преимущественно относится к 3D-графике, где растровые изображения используются для заполнения поверхностей 3D-объектов. В 2D-графике на XNA растровые изображения часто используются как спрайты.
Растровые изображения также используются в качестве значков приложений в телефоне. При создании нового проекта на XNA или Silverlight в Visual Studio для различных целей создается три растровых изображения.
Форматом растровых изображений в Windows является BMP, но в последние годы он утратил свою былую популярность, поскольку большее распространение получили форматы со сжатием. В настоящее время самыми широко используемыми форматами являются:
XNA поддерживает все три (и многие другие). Silverlight поддерживает только
Применяемые форматами
И Silverlight, и XNA обеспечивает возможность интерактивной или алгоритмической обработки растровых изображений на уровне пикселей для формирования или изменения имеющихся растровых изображений.
Разработка 2D-графики в XNA – практически исключительно процесс перемещения спрайтов по экрану. Поэтому можно ожидать, что загрузка и отрисовка растровых изображений в приложении на XNA не составляет никакого труда, и это действительно так.
Назовем первый проект XnaLocalBitmap, потому что это растровое изображение будет храниться как часть содержимого приложения. Создадим любое растровое 320 пиксела шириной и 160 пикселов высотой, назовём его Hello.png.
(рис 7.1) Hello.png
Чтобы добавить растровое изображение в проект содержимого приложения, щелкните правой кнопкой мыши имя проекта XnaLocalBitmapContent, выберите Add, затем Existing Item (Существующий элемент). После этого перейдите к файлу. Когда файл появится в проекте, его можно щелкнуть правой кнопкой мыши и просмотреть Properties. Вы увидите, что его свойство Asset Name имеет значение "Hello".
Наша задача – вывести растровое изображение посередине экрана. В файле Game1.cs описываем поле для хранения Texture2D и еще одно поле для координат:
Проект XNA: XnaLocalBitmap Файл: Game1.cs (фрагмент, демонстрирующий поля)
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D helloTexture;
Vector2 position;
…
}
Оба поля задаются во время выполнения метода LoadContent. Для загрузки Texture2D используем тот же универсальный метод, который применялся для загрузки SpriteFont. Класс Texture2D имеет свойства Width и Height, определяющие размеры растрового изображения в пикселях. Как и в приложении с выводом текста посередине экрана из главы 1, поле position обозначает координаты верхнего левого угла растрового изображения на экране в пикселях:
Проект XNA: XnaLocalBitmap Файл: Game1.cs (фрагмент)
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
helloTexture = this.Content.Load<Texture2D>("Hello");
Viewport viewport = this.GraphicsDevice.Viewport;
position = new Vector2((viewport.Width - helloTexture.Width) / 2, (viewport.Height - helloTexture.Height) / 2);
}
Класс SpriteBatch имеет семь методов Draw для формирования визуального представления растровых изображений. Этот, безусловно, самый простой:
Проект XNA: XnaLocalBitmap Файл: Game1.cs (фрагмент)
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Navy);
spriteBatch.Begin();
spriteBatch.Draw(helloTexture,position, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
Последний аргумент Draw – это цвет, который может использоваться для смягчения существующих цветов растрового изображения. Используйте Color.White, если хотите, чтобы цвета растрового изображения отображались без искажения.
И вот, что мы получили:
(рис 7.2) Результат выполнения программы
Аналогичное приложение на Silverlight даже еще проще. Создадим проект SilverlightLocalBitmap. Сначала создадим в проекте папку для хранения растрового изображения. Это не обязательно, но делает проект более аккуратным. Обычно разработчики называют эту папку Images (Рисунки), Media (Мультимедиа) или Assets (Ресурсы) в зависимости от типов файлов, для которых она предназначается. Щелкните правой кнопкой мыши имя проекта, выберите Add и затем New Folder (Новая папка). Назовем ее Images. Затем щелкаем правой кнопкой мыши имя папки и выбираем Add и Existing Item. Переходим к файлу Hello.png. (Если вы самостоятельно создали другой растровый рисунок, не забывайте, что Silverlight поддерживает только файлы в формате
Из кнопки Add выберите Add или Add as Link (Добавить как ссылку). Если выбрана опция Add, файл будет физически скопирован в подпапку проекта. При выборе Add as Link в проекте будет сохранена только ссылка на файл, но файл изображения все равно будет скопирован в исполняемый файл.
Заключительный шаг – щелкаем правой кнопкой мыши имя файла растрового изображения и открываем Properties. Убеждаемся, что Build Action (Действие при сборке) имеет значение Resource (Ресурс). Можно изменить значение Build Action на Content, но давайте пока оставим его неизменным, и остановимся на различиях несколько позже.
В Silverlight элемент Image используется для отображения растровых изображений точно так же, как элемент TextBlock используется для отображения текста. Задайте в качестве значения свойства Source (Источник) элемента Image путь к файлу растрового изображения в проекте:
Проект Silverlight: SilverlightLocalBitmap Файл: MainPage.xaml (фрагмент)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Image Source="Images/Hello.png" />
</Grid>
Изображение несколько отличается от обеспечиваемого приложением на XNA, и дело не только в заголовках. По умолчанию элемент Image расширяет или растягивает растровое изображение максимально, как только возможно, для заполнения контейнера (сетки для содержимого), сохраняя при этом его пропорции. Особенно это заметно, если задать атрибуту SupportedOrientations начального тега PhoneApplicationPage значение PortraitOrLandscape и повернуть телефон на бок:
Если требуется вывести растровое изображение в его натуральную величину, задайте свойству Stretch элемента Image значение None:
<Image Source="Images/Hello.png" Stretch="None" />
(рис 7.3) Результат выполнения программы
Одна из самых замечательных возможностей, предоставляемых элементом Image – возможность задания URL в качестве значения свойства Source, как в данном проекте на Silverlight:
Проект Silverlight: SilverlightWebBitmap Файл: MainPage.xaml (фрагмент)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Image Source="http://i3.msdn.microsoft.com/Areas/Sto/Content/Theming/windowsphone/images/logo_windowsphone.png" />
</Grid>
(рис 7.4) Изображение из интернета
Несомненно, это довольно просто, и извлечение изображений из Интернета, вместо того чтобы сохранять их в приложении, конечно же, намного сокращает размер исполняемого файла. Но нет никакой гарантии, что приложение, выполняющееся под управлением Windows Phone 7, будет иметь подключение к Интернету, не говоря уже о других проблемах, связанных с загрузкой файлов. Элемент Image имеет два события, ImageOpened (Изображение открыто) и ImageFailed (Ошибка загрузки изображения), которые могут использоваться для определения успешности или сбоя загрузки.
В приложениях для Windows Phone 7, использующих большое количество растровых изображений, необходимо все тщательно продумать. Растровые изображения могут встраиваться в исполняемый файл и быть гарантированно доступными, или можно сэкономить память телефона и загружать изображения только по мере необходимости.
Более тщательное рассмотрение элемента Image приводит в замешательство. Элемент Image не является растровым изображением, он просто обеспечивает отображение растрового изображения. Во всех примерах ранее в качестве значения свойства Source объекта Image задавался путь к файлу или URL:
<Image Source="http://i3.msdn.microsoft.com/Areas/Sto/Content/Theming/windowsphone/images/logo_windowsphone.png" />
Можно предположить, что это свойство Source типа string. Это не так. На самом деле здесь представлен синтаксис XAML, скрывающий довольно многое. Свойство Source ImageSource (Источник изображения). Это абстрактный класс, от которого наследуется BitmapSource (Источник растрового изображения). А это еще один абстрактный класс, описывающий метод SetSource (Задать источник), который позволяет загружать растровое изображение из объекта Stream.
От класса BitmapSource наследуется BitmapImage (Растровое изображение), который поддерживает конструктор, принимающий объект Uri и также включающий свойство UriSource (Источник URI) типа Uri. Проект SilverlightTapToDownload1 имитирует приложение, загружающее растровое изображение, URL которого известен только во время выполнения. XAML включает элемент Image без растрового изображения:
Проект Silverlight: SilverlightTapToDownload1 Файл: MainPage.xaml (фрагмент)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Image Name="img" />
</Grid>
BitmapImage требует подключения пространства имен System.Windows.Media.Imaging посредством директивы using. Когда MainPage регистрирует касание, он создает BitmapImage из объекта Uri и задает его в качестве значения свойства Source элемента Image:
Проект Silverlight: SilverlightTapToDownload1 Файл: MainPage.xaml.cs (фрагмент)
public MainPage()
{
InitializeComponent();
}
protected override void OnManipulationStarted(ManipulationStartedEventArgs args)
{
Uri uri = new Uri("http://i3.msdn.microsoft.com/Areas/Sto/Content/Theming/windowsphone/images/logo_windowsphone.png ");
System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage(uri);
img.Source = bmp; args.Complete();
args.Handled = true;
base.OnManipulationStarted(args);
}
Не забудьте коснуться экрана, чтобы начать загрузку!
Класс BitmapImage описывает события ImageOpened и ImageFailed (которые дублируются элементом Image) и также включает событие DownloadProgess (Процесс загрузки).
В данной лекции мы:
А Silverlight только
Создайте свою программу содержащую изображения, как из самого проекта, так и из интернета.
Цель лекции: научиться работать с изображениями как в XNA, так и в Silverlight.
Еще одним объектом, который применяется в приложениях на Silverlight и XNA так же широко, как и текст, является растровое изображение. Ранее растровое изображение определялось как двумерный массив битов, соответствующих пикселям графического устройства.
В Silverlight растровое изображение иногда называют просто изображением, но это, главным образом, наследие Windows Presentation Foundation, где изображениями называют и растровые изображения, и векторные рисунки. И в WPF, и в Silverlight элемент Image обеспечивает вывод на экран растровых изображений, но сам не является растровым изображением.
В XNA растровое изображение типа Texture2D и, следовательно, часто называется текстурой, но этот термин преимущественно относится к 3D-графике, где растровые изображения используются для заполнения поверхностей 3D-объектов. В 2D-графике на XNA растровые изображения часто используются как спрайты.
Растровые изображения также используются в качестве значков приложений в телефоне. При создании нового проекта на XNA или Silverlight в Visual Studio для различных целей создается три растровых изображения.
Форматом растровых изображений в Windows является BMP, но в последние годы он утратил свою былую популярность, поскольку большее распространение получили форматы со сжатием. В настоящее время самыми широко используемыми форматами являются:
XNA поддерживает все три (и многие другие). Silverlight поддерживает только
Применяемые форматами
И Silverlight, и XNA обеспечивает возможность интерактивной или алгоритмической обработки растровых изображений на уровне пикселей для формирования или изменения имеющихся растровых изображений.
Разработка 2D-графики в XNA – практически исключительно процесс перемещения спрайтов по экрану. Поэтому можно ожидать, что загрузка и отрисовка растровых изображений в приложении на XNA не составляет никакого труда, и это действительно так.
Назовем первый проект XnaLocalBitmap, потому что это растровое изображение будет храниться как часть содержимого приложения. Создадим любое растровое 320 пиксела шириной и 160 пикселов высотой, назовём его Hello.png.
(рис 7.1) Hello.png
Чтобы добавить растровое изображение в проект содержимого приложения, щелкните правой кнопкой мыши имя проекта XnaLocalBitmapContent, выберите Add, затем Existing Item (Существующий элемент). После этого перейдите к файлу. Когда файл появится в проекте, его можно щелкнуть правой кнопкой мыши и просмотреть Properties. Вы увидите, что его свойство Asset Name имеет значение "Hello".
Наша задача – вывести растровое изображение посередине экрана. В файле Game1.cs описываем поле для хранения Texture2D и еще одно поле для координат:
Проект XNA: XnaLocalBitmap Файл: Game1.cs (фрагмент, демонстрирующий поля)
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D helloTexture;
Vector2 position;
…
}
Оба поля задаются во время выполнения метода LoadContent. Для загрузки Texture2D используем тот же универсальный метод, который применялся для загрузки SpriteFont. Класс Texture2D имеет свойства Width и Height, определяющие размеры растрового изображения в пикселях. Как и в приложении с выводом текста посередине экрана из главы 1, поле position обозначает координаты верхнего левого угла растрового изображения на экране в пикселях:
Проект XNA: XnaLocalBitmap Файл: Game1.cs (фрагмент)
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
helloTexture = this.Content.Load<Texture2D>("Hello");
Viewport viewport = this.GraphicsDevice.Viewport;
position = new Vector2((viewport.Width - helloTexture.Width) / 2, (viewport.Height - helloTexture.Height) / 2);
}
Класс SpriteBatch имеет семь методов Draw для формирования визуального представления растровых изображений. Этот, безусловно, самый простой:
Проект XNA: XnaLocalBitmap Файл: Game1.cs (фрагмент)
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Navy);
spriteBatch.Begin();
spriteBatch.Draw(helloTexture,position, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
Последний аргумент Draw – это цвет, который может использоваться для смягчения существующих цветов растрового изображения. Используйте Color.White, если хотите, чтобы цвета растрового изображения отображались без искажения.
И вот, что мы получили:
(рис 7.2) Результат выполнения программы
Аналогичное приложение на Silverlight даже еще проще. Создадим проект SilverlightLocalBitmap. Сначала создадим в проекте папку для хранения растрового изображения. Это не обязательно, но делает проект более аккуратным. Обычно разработчики называют эту папку Images (Рисунки), Media (Мультимедиа) или Assets (Ресурсы) в зависимости от типов файлов, для которых она предназначается. Щелкните правой кнопкой мыши имя проекта, выберите Add и затем New Folder (Новая папка). Назовем ее Images. Затем щелкаем правой кнопкой мыши имя папки и выбираем Add и Existing Item. Переходим к файлу Hello.png. (Если вы самостоятельно создали другой растровый рисунок, не забывайте, что Silverlight поддерживает только файлы в формате
Из кнопки Add выберите Add или Add as Link (Добавить как ссылку). Если выбрана опция Add, файл будет физически скопирован в подпапку проекта. При выборе Add as Link в проекте будет сохранена только ссылка на файл, но файл изображения все равно будет скопирован в исполняемый файл.
Заключительный шаг – щелкаем правой кнопкой мыши имя файла растрового изображения и открываем Properties. Убеждаемся, что Build Action (Действие при сборке) имеет значение Resource (Ресурс). Можно изменить значение Build Action на Content, но давайте пока оставим его неизменным, и остановимся на различиях несколько позже.
В Silverlight элемент Image используется для отображения растровых изображений точно так же, как элемент TextBlock используется для отображения текста. Задайте в качестве значения свойства Source (Источник) элемента Image путь к файлу растрового изображения в проекте:
Проект Silverlight: SilverlightLocalBitmap Файл: MainPage.xaml (фрагмент)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Image Source="Images/Hello.png" />
</Grid>
Изображение несколько отличается от обеспечиваемого приложением на XNA, и дело не только в заголовках. По умолчанию элемент Image расширяет или растягивает растровое изображение максимально, как только возможно, для заполнения контейнера (сетки для содержимого), сохраняя при этом его пропорции. Особенно это заметно, если задать атрибуту SupportedOrientations начального тега PhoneApplicationPage значение PortraitOrLandscape и повернуть телефон на бок:
Если требуется вывести растровое изображение в его натуральную величину, задайте свойству Stretch элемента Image значение None:
<Image Source="Images/Hello.png" Stretch="None" />
(рис 7.3) Результат выполнения программы
Одна из самых замечательных возможностей, предоставляемых элементом Image – возможность задания URL в качестве значения свойства Source, как в данном проекте на Silverlight:
Проект Silverlight: SilverlightWebBitmap Файл: MainPage.xaml (фрагмент)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Image Source="http://i3.msdn.microsoft.com/Areas/Sto/Content/Theming/windowsphone/images/logo_windowsphone.png" />
</Grid>
(рис 7.4) Изображение из интернета
Несомненно, это довольно просто, и извлечение изображений из Интернета, вместо того чтобы сохранять их в приложении, конечно же, намного сокращает размер исполняемого файла. Но нет никакой гарантии, что приложение, выполняющееся под управлением Windows Phone 7, будет иметь подключение к Интернету, не говоря уже о других проблемах, связанных с загрузкой файлов. Элемент Image имеет два события, ImageOpened (Изображение открыто) и ImageFailed (Ошибка загрузки изображения), которые могут использоваться для определения успешности или сбоя загрузки.
В приложениях для Windows Phone 7, использующих большое количество растровых изображений, необходимо все тщательно продумать. Растровые изображения могут встраиваться в исполняемый файл и быть гарантированно доступными, или можно сэкономить память телефона и загружать изображения только по мере необходимости.
Более тщательное рассмотрение элемента Image приводит в замешательство. Элемент Image не является растровым изображением, он просто обеспечивает отображение растрового изображения. Во всех примерах ранее в качестве значения свойства Source объекта Image задавался путь к файлу или URL:
<Image Source="http://i3.msdn.microsoft.com/Areas/Sto/Content/Theming/windowsphone/images/logo_windowsphone.png" />
Можно предположить, что это свойство Source типа string. Это не так. На самом деле здесь представлен синтаксис XAML, скрывающий довольно многое. Свойство Source ImageSource (Источник изображения). Это абстрактный класс, от которого наследуется BitmapSource (Источник растрового изображения). А это еще один абстрактный класс, описывающий метод SetSource (Задать источник), который позволяет загружать растровое изображение из объекта Stream.
От класса BitmapSource наследуется BitmapImage (Растровое изображение), который поддерживает конструктор, принимающий объект Uri и также включающий свойство UriSource (Источник URI) типа Uri. Проект SilverlightTapToDownload1 имитирует приложение, загружающее растровое изображение, URL которого известен только во время выполнения. XAML включает элемент Image без растрового изображения:
Проект Silverlight: SilverlightTapToDownload1 Файл: MainPage.xaml (фрагмент)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Image Name="img" />
</Grid>
BitmapImage требует подключения пространства имен System.Windows.Media.Imaging посредством директивы using. Когда MainPage регистрирует касание, он создает BitmapImage из объекта Uri и задает его в качестве значения свойства Source элемента Image:
Проект Silverlight: SilverlightTapToDownload1 Файл: MainPage.xaml.cs (фрагмент)
public MainPage()
{
InitializeComponent();
}
protected override void OnManipulationStarted(ManipulationStartedEventArgs args)
{
Uri uri = new Uri("http://i3.msdn.microsoft.com/Areas/Sto/Content/Theming/windowsphone/images/logo_windowsphone.png ");
System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage(uri);
img.Source = bmp; args.Complete();
args.Handled = true;
base.OnManipulationStarted(args);
}
Не забудьте коснуться экрана, чтобы начать загрузку!
Класс BitmapImage описывает события ImageOpened и ImageFailed (которые дублируются элементом Image) и также включает событие DownloadProgess (Процесс загрузки).
В данной лекции мы:
А Silverlight только
Создайте свою программу содержащую изображения, как из самого проекта, так и из интернета.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.