Работа с изображениями. Программа Picture Viewer
Работа с изображениями — одно из самых увлекательных занятий на компьютере. Не менее интересно создавать графические программы. Во второй лекции мы сталкивались с элементом PictureBox, в который помещали рисунок для окна "О программе". Теперь мы научимся загружать в этот элемент изображения, сохранять их в другом формате и распечатывать. Создайте новое приложение и назовите его PictureViewer. Добавляем на форму меню (рис. 6.8), контекстное меню, OpenFileDialog, SaveFileDialog, PictureBox, устанавливаем следующие свойства элементов управления:
mnuFile | &Файл | |
mnuOpen | &Открыть | CtrlO |
mnuSave | &Сохранить | CtrlS |
menuItem1 | — | |
mnuPageSetup | Пара&метры страницы | |
mnuPrintPreview | Пред&варительный просмотр | |
mnuPrint | &Печать | CtrlP |
mnuExit | &Exit | AltF4 |
mnuView | &Вид | |
mnuResize | &Подогнать размер | |
mnuActual | &Истинный размер | |
mnuCenterImage | &По центру | |
mnuAutoSize | &Автоматический размер |
Рис. 6.8. Пункты главного меню программы Picture Viewer
mnuResize | &Подогнать размер |
mnuActual | &Истинный размер |
mnuCenterImage | &По центру |
mnuAutoSize | &Автоматический размер |
Title | Выбор изображения |
Title | Сохранение изображения |
ContextMenu | contextMenu1 |
Dock | Fill |
SizeMode | StretchImage |
Приложение будет отображать в элементе управления 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, устанавливаем следующие свойства элементов управления:
mnuFile | &Файл | |
mnuOpen | &Открыть | CtrlO |
mnuSave | &Сохранить | CtrlS |
menuItem1 | — | |
mnuPageSetup | Пара&метры страницы | |
mnuPrintPreview | Пред&варительный просмотр | |
mnuPrint | &Печать | CtrlP |
mnuExit | &Exit | AltF4 |
mnuView | &Вид | |
mnuResize | &Подогнать размер | |
mnuActual | &Истинный размер | |
mnuCenterImage | &По центру | |
mnuAutoSize | &Автоматический размер |
Рис. 6.8. Пункты главного меню программы Picture Viewer
mnuResize | &Подогнать размер |
mnuActual | &Истинный размер |
mnuCenterImage | &По центру |
mnuAutoSize | &Автоматический размер |
Title | Выбор изображения |
Title | Сохранение изображения |
ContextMenu | contextMenu1 |
Dock | Fill |
SizeMode | StretchImage |
Приложение будет отображать в элементе управления 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