Часть XIII. Методология создания, конвертирования и мультипликацииизображений на форме

Глава 64. Методика задания, конвертирования и поочередной замены изображений

Листинг 64.1. Метод с нашим кодом для вывода фонового изображения.

private void Form1_Load(object sender, EventArgs e)

{

this.BackgroundImage =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig1.jpg");

}

Интересна другая запись нашей строки кода:

this.BackgroundImage =

Image.FromFile(@"D:\MyDocs\MyDocs F\Fig1.jpg");

После старта проекта (Build, Build Solution; Debug, Start Without Debugging) появляется форма с фоновым изображением в виде файла Fig1.jpg (рис. 64.6).

Листинг 64.2. Обработчик щелчка кнопки для вывода фонового изображения.

private void button1_Click(object sender, EventArgs e)

{

this.groupBox1.BackgroundImage =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig5.jpg");

}

Теперь после старта проекта и щелчка кнопки предыдущее фоновое изображение Fig1.jpg (листинг 64.1) заменится новым изображением Fig5.jpg (листинг 64.2), показанным на рис. 64.7.

Аналогично можно записать наш код в любой другой метод, например, в обработчик щелчка по форме или по любому другому элементу управления.

Листинг 64.3. Конвертирование, сохранение и вывод изображения.

private void Form1_Load(object sender, EventArgs e)

{

//Загружаем Fig2_1.jpg в объект myImage класса Image:

Image myImage =

Image.FromFile(@"D:\MyDocs\MyDocs F\Fig2_1.jpg");

//Конвертируем Fig2_1.jpg в (.gif) и сохраняем Save:

myImage.Save(@"D:\MyDocs\MyDocs F\Fig2_1.gif",

System.Drawing.Imaging.ImageFormat.Gif);

//Выводим изображение как фоновое для формы:

this.BackgroundImage =

Image.FromFile(@"D:\MyDocs\MyDocs F\Fig2_1.gif");

}

Аналогично для конвертирования изображения Fig2_1.gif из формата (.gif), например, в формат (.png) используется код:

Image myImage =

Image.FromFile(@"D:\MyDocs\MyDocs F\Fig2_1.gif");

myImage.Save(@"D:\MyDocs\MyDocs F\Fig2_1.png",

System.Drawing.Imaging.ImageFormat.Png);

Аналогично конвертируются изображения из одного формата в другой из перечня поддерживаемых форматов на рис. 64.8.

После старта проекта мы увидим форму с фоновым изображением в другом формате (рис. 64.9).

Теперь в файл Form1.cs необходимо написать нашу часть кода. Сначала в любом месте внутри класса Form1 (например, ниже свернутого блока кода) объявляем массив изображений класса Image и глобальные переменные:

//Массив из 8 изображений (индекс 0 не используем):

Image[] myArrayImages = new Image[9];

//Объявляем и инициализируем целочисленные переменные:

int j = 0;

int k = 1;

Дважды щелкаем по Form1 в режиме проектирования (или в панели Properties на вкладке Events дважды щелкаем по имени события Load) и в появившийся шаблон записываем наш код, после чего метод принимает такой вид.

Листинг 64.4. Метод Form1_Load для загрузки изображений.

private void Form1_Load(object sender, EventArgs e)

{

//Из графических файлов 8 рисунков формата (.jpg)

//заполняем массив myArrayImages[9]:

myArrayImages[1] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig1.jpg");

myArrayImages[2] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig2.jpg");

myArrayImages[3] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig3.jpg");

myArrayImages[4] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig4.jpg");

myArrayImages[5] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig5.jpg");

myArrayImages[6] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig6.jpg");

myArrayImages[7] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig7.jpg");

myArrayImages[8] =

Image.FromFile("D:\\MyDocs\\MyDocs F\\Fig8.jpg");

}

Аналогично в приложение загружаются другие массивы, если мы хотим использовать чередование серии одних изображений сериями других. Чтобы подключить к работе таймер, дважды щелкаем значок timer1 (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.

Листинг 64.5.Метод для компонента Timer1.

private void timer1_Tick(object sender, EventArgs e)

{

//Выводим изображение в качестве фонового PictureBox:

pictureBox1.BackgroundImage = myArrayImages[j];

//Организовываем цикл для восьми рисунков:

j = j + k;

if (j == 8)

{

//От последнего рисунка переходим к первому:

k = -8;

}

else if (j == 0)

{

//Задаем первый рисунок для начала цикла:

k = 1;

}

}

Запускаем проект: Build, Build Solution; Debug, Start Without Debugging.

В ответ Visual C# выполняет программу и на рабочий стол выводит Form1 в режиме выполнения (рис. 64.9). Внутри элемента pictureBoxосуществляется поочередная замена одного рисунка следующим за интервал времени в 1000 миллисекунд, который мы установили с помощью свойства Interval в панели Properties для компонента Timer (Таймер). Частота смены изображений регулируется за счет изменения значения свойства Interval. Вместо элемента pictureBox в качестве окна мы можем использовать другой элемент, например, Panel или GroupBox, или какой-либо еще.

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

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




Глава 65. Методика разработки мульти­пликации

Теперь в файл Form1.cs необходимо написать нашу часть кода для выполнения мультипликации. Сначала в любом месте внутри класса Form1 (например, ниже свернутого блока кода) объявляем массив и глобальные переменные:

//Объявляем массив из 6 изображений:

Image[] myArrayImages = new Image[6];

//Объявляем и инициализируем целочисленные переменные:

int j = 0; int k = 1;

Дважды щелкаем по Form1 в режиме проектирования (или Properties, Events, Load) и в шаблон записываем такой наш код.

Листинг 65.1. Метод Form1_Load для загрузки рисунков.

private void Form1_Load(object sender, EventArgs e)

{

//Из графических файлов 6 рисунков формата (.bmp)

//заполняем массив myArrayImages[6]:

myArrayImages[0] = Image.FromFile("E:/MyDocs/" +

"Анимация/Рисунки анимации/DeepDrawing_step0.bmp");

myArrayImages[1] = Image.FromFile("E:/MyDocs//" +

"Анимация/Рисунки анимации/DeepDrawing_step1.bmp");

myArrayImages[2] = Image.FromFile("E:/MyDocs/" +

"Анимация/Рисунки анимации/DeepDrawing_step2.bmp");

myArrayImages[3] = Image.FromFile("E:/MyDocs/" +

"Анимация/Рисунки анимации/DeepDrawing_step3.bmp");

myArrayImages[4] = Image.FromFile("E:/MyDocs/" +

"Анимация/Рисунки анимации/DeepDrawing_step4.bmp");

myArrayImages[5] = Image.FromFile("E:/MyDocs/" +

"Анимация/Рисунки анимации/DeepDrawing_step5.bmp");

}

Напомним, что метод Form1_Load выполняется одновременно с появлением (загрузкой – Load) Form1 на экране монитора. При этом рисунки мультипликации из любой папки загружаются в массив рисунков myArrayImages[N] с любым (заданным нами) количеством элементов N. Отметим, что в этом листинге полный путь расположения файла каждого рисунка формата (.bmp), начиная от диска E, записан на двух строках по правилу переноса на C#.

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

Чтобы подключить к работе таймер, дважды щелкаем значок timer1 (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.

Листинг 65.2. Метод для мультипликации изображений.

private void timer1_Tick(object sender, EventArgs e)

{

//Создаем объект myGraphics класса Graphics:

Graphics myGraphics = CreateGraphics();

//Вызываем метод DrawImage, используя перегрузку №8:

myGraphics.DrawImage(myArrayImages[j], -10, -10,

myArrayImages[j].Width, myArrayImages[j].Height);

//Высвобождаем ресурсы, выделенные объекту myGraphics:

myGraphics.Dispose();

//Организовываем цикл для шести рисунков:

j = j + k;

if (j == 5)

{

//От последнего рисунка переходим к первому:

k = -5;

}

else if (j == 0)

{

//Задаем первый рисунок для начала цикла:

k = 1;

}

}

В этом коде главным является вызов перегруженного метода DrawImage, который в VC# имеет много видов перегрузки. Здесь использована перегрузка с сигнатурой Graphics.DrawImage Method(Image, Int32, Int32, Int32, Int32).

Напомним, что система координат связана с Form1, а начало координат (0, 0) расположено в верхнем левом углу этой Form1. Координаты (-10, -10) в коде являются координатами верхнего левого угла j – го рисунка (j = 0, 1, 2, 3, 4, 5). Изменяя эти координаты, мы можем удобнее расположить рисунок на Form1. Последние два параметра в методе DrawImage определяют ширину и высоту рисунка на форме Form1.

Учитывая важность данного кода для использования на практике, приведем его второй вариант. А именно, вместо вывода рисунков при помощи метода DrawImage (точнее, вместо приведенной на листинге строки кода с этим методом), мультипликацию можно выводить в рамку рисунка pictureBox1 (предварительно расположив этот элемент PictureBox на форме) при помощи кода:

//Центрируем каждый рисунок внутри рамки pictureBox1:

pictureBox1.SizeMode =

PictureBoxSizeMode.CenterImage;

//Выводим j-е рисунки с интервалом Interval:

pictureBox1.Image = myArrayImages[j];

Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползункаэлемента управления TrackBar, дважды щелкаем элемент управления TrackBarв режиме проектирования. Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает вид следующей процедуры:

Листинг 65.3. Метод для элемента управления TrackBar.

private void trackBar1_Scroll(object sender,

EventArgs e)

{

//Устанавливаем свойство Enabled таймера, равным True:

timer1.Enabled = true;

//Устанавливаем значение свойства Interval таймера

//в зависимости от перемещения ползунка Value:

timer1.Interval = trackBar1.Value;

}

Согласно разработанной выше методике, чтобы иметь возможность приостановить (и запустить вновь) процесс анимации на любом рисунке при помощи кнопки Stop Animation, дважды щелкаем эту кнопку в режиме проектирования (рис. 65.8). Появляется файл Form1.cs с шаблоном, который после записи нашего кода имеет такой вид.

Листинг 65.4. Обработчик щелчка кнопки Stop Animation.

//Объявляем булеву переменную OffOn

//и задаем ей значение, например, false:

bool OffOn = false;

private void button6_Click(object sender, EventArgs e)

{

//Задаем чередование остановки и возобновления анимации

//после каждого щелчка кнопки button:

if (OffOn == false)

{

//Приостанавливаем анимацию:

timer1.Enabled = false;

//Изменяем значение OffOn на противоположное:

OffOn = true;

}

else

{

//Возобновляем анимацию:

timer1.Enabled = true;

//Изменяем значение OffOn на противоположное:

OffOn = false;

}

}

Листинг 65.5.Метод для компонента PrintDocument.

private void printDocument1_PrintPage(object sender,

System.Drawing.Printing.PrintPageEventArgs e)

{

//Чтобы печатать тот j-й рисунок, который видим:

j = j - 1;

//Выводим j-й рисунок, который видим на экране,

//при помощи метода DrawImage, используя перегрузку 8:

e.Graphics.DrawImage(myArrayImages[j], -10, -10,

myArrayImages[j].Width,

myArrayImages[j].Height);

}

Теперь дважды щелкаем кнопку Print (рис. 65.8). Открывается файл Form1.cs с шаблоном, который после записи нашего кода принимает такой вид.

Листинг 65.6.Обработчик щелчка кнопки Print.

private void button3_Click(object sender, EventArgs e)

{

//Передаем объекту PrintDialog1 информацию об объекте

//PrintDocument1 при помощи свойства Document:

printDialog1.Document = printDocument1;

//Выводим стандартную панель Print при помощи метода

//ShowDialog для задания параметров печати:

if (printDialog1.ShowDialog() == DialogResult.OK)

printDocument1.Print();

}

Проверяем в действии созданную нами программу для печати на принтере любого рисунка мультипликации (на примере изготовления стакана). Для этого получаем на экране монитора (по описанной выше методике) разработанную мультипликацию, останавливаем мультипликацию на интересующем нас рисунке (при помощи кнопки Stop Animation) и щелкаем кнопку Print.

Щелкая кнопки Stop Animation и Print в различные моменты изменения (мультипликации) рисунка, мы получим на принтере распечатки различных (во времени) положений рисунка.

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


Наши рекомендации