Top.Mail.Ru

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();

        }

    }

}