Создание Windows-приложений на основе Visual C#

         

Работа с изображениями. Программа Picture Viewer


Работа с изображениями — одно из самых увлекательных занятий на компьютере. Не менее интересно создавать графические программы. Во второй лекции мы сталкивались с элементом PictureBox, в который помещали рисунок для окна "О программе". Теперь мы научимся загружать в этот элемент изображения, сохранять их в другом формате и распечатывать. Создайте новое приложение и назовите его PictureViewer. Добавляем на форму меню (рис. 6.8), контекстное меню, OpenFileDialog, SaveFileDialog, PictureBox, устанавливаем следующие свойства элементов управления:

mainMenu1, NameTextShortcut
mnuFile&Файл
mnuOpen&ОткрытьCtrlO
mnuSave&СохранитьCtrlS
menuItem1
mnuPageSetupПара&метры страницы
mnuPrintPreviewПред&варительный просмотр
mnuPrint&ПечатьCtrlP
mnuExit&ExitAltF4
mnuView&Вид
mnuResize&Подогнать размер
mnuActual&Истинный размер
mnuCenterImage&По центру
mnuAutoSize&Автоматический размер


Рис. 6.8.  Пункты главного меню программы Picture Viewer

contextMenu1, NameText
mnuResize&Подогнать размер
mnuActual&Истинный размер
mnuCenterImage&По центру
mnuAutoSize&Автоматический размер
openFileDialog1, СвойствоЗначение
TitleВыбор изображения
openFileDialog1, СвойствоЗначение
TitleСохранение изображения
pictureBox1, СвойствоЗначение
ContextMenucontextMenu1
DockFill
SizeModeStretchImage

Приложение будет отображать в элементе управления PictureBox загруженный рисунок. Добавляем обработчик пункта меню mnuOpen:

private void mnuOpen_Click(object sender, System.EventArgs e) { OpenFileDialog diag = new OpenFileDialog(); diag.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*" ; if (diag.ShowDialog() == DialogResult.OK) { pictureBox1.Image = new Bitmap(diag.OpenFile()); } pictureBox1.Image= new Bitmap(diag.OpenFile());

}

Несмотря на определение формата jpeg в качестве основного, элемент PictureBox поддерживает также работу с форматами Bitmap (.bmp), Icon (.ico), GIF (.gif), Metafile (.wmf). Сохранения файла практически не отличается от сохранения содержимого текстового поля:


Работа с изображениями — одно из самых увлекательных занятий на компьютере. Не менее интересно создавать графические программы. Во второй лекции мы сталкивались с элементом PictureBox, в который помещали рисунок для окна "О программе". Теперь мы научимся загружать в этот элемент изображения, сохранять их в другом формате и распечатывать. Создайте новое приложение и назовите его PictureViewer. Добавляем на форму меню (рис. 6.8), контекстное меню, OpenFileDialog, SaveFileDialog, PictureBox, устанавливаем следующие свойства элементов управления:

mainMenu1, NameTextShortcut
mnuFile&Файл
mnuOpen&ОткрытьCtrlO
mnuSave&СохранитьCtrlS
menuItem1
mnuPageSetupПара&метры страницы
mnuPrintPreviewПред&варительный просмотр
mnuPrint&ПечатьCtrlP
mnuExit&ExitAltF4
mnuView&Вид
mnuResize&Подогнать размер
mnuActual&Истинный размер
mnuCenterImage&По центру
mnuAutoSize&Автоматический размер


Рис. 6.8.  Пункты главного меню программы Picture Viewer

contextMenu1, NameText
mnuResize&Подогнать размер
mnuActual&Истинный размер
mnuCenterImage&По центру
mnuAutoSize&Автоматический размер
openFileDialog1, СвойствоЗначение
TitleВыбор изображения
openFileDialog1, СвойствоЗначение
TitleСохранение изображения
pictureBox1, СвойствоЗначение
ContextMenucontextMenu1
DockFill
SizeModeStretchImage

Приложение будет отображать в элементе управления PictureBox загруженный рисунок. Добавляем обработчик пункта меню mnuOpen:

private void mnuOpen_Click(object sender, System.EventArgs e) { OpenFileDialog diag = new OpenFileDialog(); diag.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*" ; if (diag.ShowDialog() == DialogResult.OK) { pictureBox1.Image = new Bitmap(diag.OpenFile()); } pictureBox1.Image= new Bitmap(diag.OpenFile());

}

Несмотря на определение формата jpeg в качестве основного, элемент PictureBox поддерживает также работу с форматами Bitmap (.bmp), Icon (.ico), GIF (.gif), Metafile (.wmf). Сохранения файла практически не отличается от сохранения содержимого текстового поля:




Листинг 6.6.



(html, txt)

Обратите внимание на возможность конвертирования форматов — метод Save свойства предоставляет возможность сохранения содержимого PictureBox в различных форматах (рис. 6.9).


Рис. 6.9.  Второй параметр метода Save принимает название графического формата

Мы выбрали формат Jpeg — при открытии рисунка в другом формате, например, Bmp, и последующем сохранении он будет конвертирован в этот формат.

Элемент управления PictureBox поддерживает несколько вариантов отображения загружаемого рисунка (рис. 6.10).


увеличить изображение
Рис. 6.10.  Режимы отображения рисунка элементов PictureBox: подогнать размер (StretchImage), истинный размер (Normal), по центру (CenterImage), автоматический размер (AutoSize)

Мы установили свойству SizeMode значение StretchImage, и поэтому при открывании рисунка его размер автоматически подгоняется под размер PictureBox и, соответственно, формы. Истинный размер выводит рисунок в его действительных пропорциях; при этом на экране помещается только его часть. Конечно, в этом режиме необходима прокрутка рисунка — об этом чуть позже. Режим по центру располагает рисунок в его реальных пропорциях так, чтобы его центр совпадал с центром PictureBox. Последний режим — автоматический размер — подгоняет размеры PictureBox под размер открываемого изображения. На рис. 6.10 он визуально совпадает с режимом StretchImage — дело в том, что мы установили свойству Dock значение Fill и поэтому PictureBox уже имеет максимально большой размер.

В классе формы создадим массив ArrayMenu, в котором будут содержаться значения режимов:

private PictureBoxSizeMode[] ArrayMenu = { PictureBoxSizeMode.StretchImage, PictureBoxSizeMode.Normal, PictureBoxSizeMode.CenterImage, PictureBoxSizeMode.AutoSize };

Переменная selectedMode будет возвращать выбранное значение:

private int selectedMode = 0;

В обработчиках пунктов меню будем выбирать одно значение из массива:

Листинг 6.7.



(html, txt)


private void mnuSave_Click(object sender, System.EventArgs e) { SaveFileDialog diag = new SaveFileDialog(); diag.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*" ; if(diag.ShowDialog() != DialogResult.OK) return; // Получаем адрес файла. string filename = diag.FileName; FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite); pictureBox1.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); fs.Close(); }

Листинг 6.6.

Обратите внимание на возможность конвертирования форматов — метод Save свойства предоставляет возможность сохранения содержимого PictureBox в различных форматах (рис. 6.9).


Рис. 6.9.  Второй параметр метода Save принимает название графического формата

Мы выбрали формат Jpeg — при открытии рисунка в другом формате, например, Bmp, и последующем сохранении он будет конвертирован в этот формат.

Элемент управления PictureBox поддерживает несколько вариантов отображения загружаемого рисунка (рис. 6.10).


увеличить изображение
Рис. 6.10.  Режимы отображения рисунка элементов PictureBox: подогнать размер (StretchImage), истинный размер (Normal), по центру (CenterImage), автоматический размер (AutoSize)

Мы установили свойству SizeMode значение StretchImage, и поэтому при открывании рисунка его размер автоматически подгоняется под размер PictureBox и, соответственно, формы. Истинный размер выводит рисунок в его действительных пропорциях; при этом на экране помещается только его часть. Конечно, в этом режиме необходима прокрутка рисунка — об этом чуть позже. Режим по центру располагает рисунок в его реальных пропорциях так, чтобы его центр совпадал с центром PictureBox. Последний режим — автоматический размер — подгоняет размеры PictureBox под размер открываемого изображения. На рис. 6.10 он визуально совпадает с режимом StretchImage — дело в том, что мы установили свойству Dock значение Fill и поэтому PictureBox уже имеет максимально большой размер.

В классе формы создадим массив ArrayMenu, в котором будут содержаться значения режимов:



private PictureBoxSizeMode[] ArrayMenu = { PictureBoxSizeMode.StretchImage, PictureBoxSizeMode.Normal, PictureBoxSizeMode.CenterImage, PictureBoxSizeMode.AutoSize };

Переменная selectedMode будет возвращать выбранное значение:

private int selectedMode = 0;

В обработчиках пунктов меню будем выбирать одно значение из массива:

private void mnuResize_Click(object sender, System.EventArgs e) { if (sender is MenuItem) { MenuItem menuitem = (MenuItem)sender; selectedMode = menuitem.Index; pictureBox1.SizeMode = ArrayMenu[0]; pictureBox1.Invalidate();

}

} private void mnuActual_Click(object sender, System.EventArgs e) { if (sender is MenuItem) { MenuItem menuitem = (MenuItem)sender; selectedMode = menuitem.Index;

pictureBox1.SizeMode = ArrayMenu[1]; pictureBox1.Invalidate();

} } private void mnuCenterImage_Click(object sender, System.EventArgs e) { if (sender is MenuItem) { MenuItem menuitem = (MenuItem)sender; selectedMode = menuitem.Index;

pictureBox1.SizeMode = ArrayMenu[2]; pictureBox1.Invalidate();

} } private void mnuAutoSize_Click(object sender, System.EventArgs e) { if (sender is MenuItem) { MenuItem menuitem = (MenuItem)sender; selectedMode = menuitem.Index;

pictureBox1.SizeMode = ArrayMenu[3]; pictureBox1.Invalidate();

}

}

Листинг 6.7.

В каждом обработчике мы добавили метод Invalidate для перерисовки содержимого pictureBox1 после выбора пункта меню. Удобно, когда выбранный пункт меню помечается галочкой (см. рис. 6.10). Переходим в режим дизайна, выделяем пункт меню Вид (View) и в окне Properties дважды щелкаем в поле события Popup:

private void mnuView_Popup(object sender, System.EventArgs e) { if (sender is MenuItem) { bool ImLoad = (pictureBox1.Image != null); foreach (MenuItem menuitem in ((MenuItem)sender).MenuItems) { menuitem.Enabled = ImLoad; menuitem.Checked = (this.selectedMode == menuitem.Index); } }

}

В обработчиках пунктов контекстного меню дублируем код для соответствующих пунктов главного меню:

private void cmnuResize_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuResize_Click }



private void cmnuActual_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuActual _Click }

private void cmnuCenterImage_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuCenterImage _Click }

private void cmnuAutoSize_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuAutoSize _Click }

Запускаем приложение. Оно должно походить на приложение, изображенное на рис. 6.10. Добавим теперь к нашему приложению строку состояния, на которую будет выводиться размер загруженного изображения и его адрес. Из окна ToolBox перетаскиваем на форму элемент StatusBar, щелкаем в поле его свойства Panels и в открывшемся окне StatusBarPanel Collection Editor добавляем панели sbFile и sbSize (рис. 6.11 и рис. 6.12).


Рис. 6.11.  Панель sbFile. Свойству Width панели установлено значение 500 пикселей


Рис. 6.12.  Панель sbSize

Свойству ShowPanels элемента statusBar1 устанавливаем значение True. В обработчике пункта меню "Открыть" — код для вывода на панель sbFile адреса файла, а на панель sbSize — его размер:

private void mnuOpen_Click(object sender, System.EventArgs e) { …

//Строка для вывода во время загрузки изображения sbFile.Text = "Загрузка " + diag.FileName; //Строка для вывода после загрузки изображения sbFile.Text = "Изображение " + diag.FileName; //Вывод ширины (Width) и высоты (Height) изображения sbSize.Text= String.Format("{0:#} x {1:#}", pictureBox1.Image.Width, pictureBox1.Image.Height); }

Листинг 6.8.

Запускаем и тестируем приложение (рис. 6.13).


Рис. 6.13.  Строка состояния приложения Picture Viewer


Содержание раздела