Опубликован: 01.11.2011 | Доступ: свободный | Студентов: 1424 / 63 | Оценка: 3.84 / 3.44 | Длительность: 15:38:00
Специальности: Программист
Практическая работа 14:

Работа с растровыми изображениями в XNA

Аннотация: В данном проекте мы создадим текстуру с помощью класса SpriteBatch

Дополнительные материалы к занятию можно скачать здесь.

Ранее растровое изображение определялось как двумерный массив битов, соответствующих пикселам графического устройства [25].

В Silverlight растровое изображение иногда называют просто изображением, но это, главным образом, наследие Windows Presentation Foundation, где изображениями называют и растровые изображения, и векторные рисунки. И в WPF, и в Silverlight элемент Image обеспечивает вывод на экран растровых изображений, но сам не является растровым изображением [25].

В XNA растровое изображение типа Texture2D и, следовательно, часто называется текстурой, но этот термин преимущественно относится к 3D-графике, где растровые изображения используются для заполнения поверхностей 3D-объектов. В 2D-графике на XNA растровые изображения часто используются как спрайты.

Растровые изображения также используются в качестве значков приложений в телефоне. При создании нового проекта на XNA или Silverlight в Visual Studio для различных целей создается три растровых изображения [25].

Форматом растровых изображений в Windows является BMP, но в последние годы он утратил свою былую популярность, поскольку большее распространение получили форматы со сжатием. В настоящее время самыми широко используемыми форматами являются:

  • JPEG (Joint Photography Experts Group)
  • PNG (Portable Network Graphics)
  • GIF (Graphics Interchange File)

XNA поддерживает все три (и многие другие). Silverlight поддерживает только JPEG и PNG. (Разработчики на Silverlight не всегда помнят об этом и часто удивляются, почему это приложение на Silverlight отказывается выводить на экран GIF или BMP.) [25].

Применяемые форматами PNG и GIF алгоритмы сжатия не приводят к потере данных. Исходное растровое изображение может быть восстановлено со 100% точностью. Поэтому эти алгоритмы часто называют алгоритмами сжатия "без потерь". JPEG реализует алгоритм "с потерями", потому что отбрасывает визуальные данные, которые не воспринимаются человеческим глазом. Такой тип сжатия хорош для реалистичных изображений, таких как фотографии, но менее подходит для растровых изображений, производных от текста или векторных рисунков, таких как архитектурные чертежи или мультфильмы [25].

И Silverlight, и XNA обеспечивает возможность интерактивной или алгоритмической обработки растровых изображений на уровне пикселов для формирования или изменения имеющихся растровых изображений [25].

Для выполнения работы нам потребуется создать новое приложение XNA, назовем его p14. После этого нам потребуется небольшое изображение, назовем его test.png, которое мы сохраним в папке p14Content. Далее, нам потребуется подключить изображение к нашему проекту: p14Content(Content) -> Add -> Existing Item -> test.png -> Add.


Далее вводим следующий код в файл Game1.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;

namespace p14
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D testTexture;
        Vector2 position;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            TargetElapsedTime = TimeSpan.FromTicks(333333);
        }
        protected override void Initialize()
        {
            base.Initialize();
        }
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            testTexture = this.Content.Load<Texture2D>("test");
            Viewport viewport = this.GraphicsDevice.Viewport;
            position = new Vector2(0, 0);
        }
        protected override void UnloadContent()
        {
        }
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            base.Update(gameTime);
        }
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);
            spriteBatch.Begin();
            spriteBatch.Draw(testTexture, position, Color.White);
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}
    
Листинг .

С помощью переменной position мы задаем координаты нашего изображения (0,0) - левый верхний угол. В переменную testTexture мы записываем имя графического файла - test (.png).

Результат: