MS Visual Studio 2010. Использование битовых образов Bitmap

Для хранения изображений в библиотеке GDI+ предназначен класс Image и его потомок, класс Bitmap.

Для создания качественной анимации можно использовать битовые образы, основанные на классе Bitmap. Они позволяют хранить изображения, однажды загруженные с диска, в память ПК.

Объявляются переменные для хранения битовых образов так же, как и обычные переменные, например:

System.Drawing.Bitmap fon, kadr1,kadr2,oblako;

Здесь мы объявили 4 переменные для хранения битовых образов с именами fon, kadr1,kadr2 и oblako.

После того, как мы объявили переменные для хранения битовых образов, нужно загрузить в них эти самые битовые образы. Можно загружать картинки непосредственно из файлов, которые находятся на диске. А можно загружать картинки из файла ресурсов, предварительно создав его.

В первом случае при работе приложения необходимо, чтобы эти картинки всегда находились в той же папке, что и само приложение. Это, конечно же, не всегда целесообразно.

Пример загрузки картинки (битового образа) в переменную Bitmap из файла:

fon = new Bitmap("фон.bmp");   // фон

Естественно, файл "фон.bmp" должен лежать в папке Debug проекта.

Пример загрузки картинки (битового образа) в переменную Bitmap из файла ресурсов:

fon = Properties.Resources.Фон;   // фон

Размещение битовых образов в файле ресурсов

Открыть окно свойств проекта (Проект®Свойства)

В левой части окна выбрать категорию «Ресурсы»:

Жмем черную стрелочку возле закладки «Добавить ресурс» и выбираем Добавить существующий файл.

ресурсы проекта

Общий принцип создание мультипликации с помощью битовых образов Bitmap.

Так как отображение на экран битового образа довольно-таки медленная операция, то сначала изображение подготавливают в памяти, а на экран выводят уже в готовом виде.

Сначала создаются несколько вспомогательных объектов Bitmap:

«Фон» – хранит изображение фона;

«Кадры» – хранят отдельные кадры персонажей. Например, если для изображения идущего человека понадобится 4 кадра, каждый кадр должен храниться в отдельном объекте Bitmap.

На поверхность рисования копируется фон, и помещается нужный кадр с персонажем, потом весь лист копируется на форму. Затем эти действия повторяются, но уже со следующим кадром. Благодаря тому, что самая медленная операция – вывод на экран происходит один раз, весь процесс значительно ускоряется.

Пример создания мультипликации

Создайте новый проект с именем Kotik.

Поместите на форму ЭУ Timer.

Объявите глобальные переменные:

public partial class Form: Form
    {
        // Объявляем глобальные переменные:
      
        // битовые образы: фон, кадр1, кадр2, облако
        System.Drawing.Bitmap fon, kadr1,kadr2,oblako;
        Graphics g;    // рабочая графическая поверхность
        // приращение координаты X,
        // определяет скорость перемещения облака
        int dx = 1;
        // области, в которых находится котик и облако
        // Rectangle Содержит набор из четырех целых чисел,
        // определяющих расположение и размер прямоугольника
        Rectangle rct, robl;
        int k = 1;  //номер кадра

Теперь нужно загрузить битовые образы из файла ресурсов и начальные значения некоторым переменным:

        public Form1()
        {
            InitializeComponent();
          
            fon = Properties.Resources.Фон;
            kadr1 = Properties.Resources.кадр1;
            kadr2 = Properties.Resources.кадр2;
            oblako = Properties.Resources.облако; 
           
            // загрузить и задать фоновый рисунок формы
            this.BackgroundImage = Properties.Resources.Фон;
            // задать размер формы в соответствии
            // с размером фонового рисунка
            this.ClientSize =
                new System.Drawing.Size(new Point
                    (BackgroundImage.Width,BackgroundImage.Height));
            // сделать прозрачным фон вокруг объектов
            kadr1.MakeTransparent();
            kadr2.MakeTransparent();
            // задать вид границы окна
            this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            // g - графическая поверхность, на которой
            // будем формировать рисунок.
            // в качестве поверхности
            // будем использовать BackgroundImage формы
            g = Graphics.FromImage(BackgroundImage);
   
            // исходное положение котика
            rct.X = 70;
            rct.Y = 100;
            rct.Width = kadr1.Width;
            rct.Height = kadr1.Height;
            // исходное положение облака
            robl.X = -oblako.Width;
            robl.Y = 3;
            robl.Width = oblako.Width;
            robl.Height = oblako.Height;
            timer1.Interval = 100;
            timer1.Enabled = true;
        }

И наконец, на таймер, создаем обработчик события onTimer, где, собственно, и реализуем анимацию:

        private void onTimer(object sender, EventArgs e)
        {
            k++; //увеличиваем номер кадра
            //Значение номера кадра может быть
            //либо 1, либо 2
            if (k == 3) k = 1;
            //смещаем облако на dx вправо
            robl.X += dx;
          
            // Если облако ушло за форму,
            // то возвращаем его в исходное положение
            if(robl.X > fon.Width)
                robl.X = -oblako.Width;
           
            //На поверхности рисования рисуем
            //изображения котика
            //Будет перерисована область с координатами
            //заданными прямоугольником rct
            if (k == 1)
                g.DrawImage(kadr1, rct.X, rct.Y);
            if (k == 2)
                g.DrawImage(kadr2, rct.X, rct.Y);
            //На поверхности рисования рисуем
            //изображения облака
            //Будет перерисована область с координатами
            //заданными прямоугольником robl
            g.DrawImage(oblako, robl.X, robl.Y);
            // но для того, чтобы изменения появились,
            // надо инициировать обновление формы
            this.Invalidate();
        }
    }
}

 

Добавить комментарий
  • Комментарии не найдены
 
DMC Firewall is developed by Dean Marshall Consultancy Ltd