обычно требуют много памяти. После вызова Image.Dispose() экземпляр Image больше не ссылается на какое-либо реальное изображение и поэтому не может больше выводиться (если не будет загружено новое изображение).

Выполнение этого кода создает результат:

COMFest (www.comfest.co.uk) является неформальной группой разработчиков в Великобритании, которые встречаются для обсуждения самых новых технологий, обмена идеями и т. д. Снимок включает всех участников COMFest 4, за исключением автора этой главы, который фотографировал.

Вопросы, возникающие при манипуляциях с изображениями

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

Наиболее важным моментом при работе с изображениями является то, что они всегда прямоугольные. Это не просто удобство для людей. Такая форма связана с тем, что все современные графические платы имеют встроенное оборудование, которое может очень эффективно копировать блоки пикселей из одного участка памяти в другой. При условии, что блок пикселей представляет прямоугольную область, аппаратное ускорение выполняется практически как одна операция, и поэтому будет очень быстрым. На самом деле это ключ к современной высокопроизводительной графике. Такая операция называется переносом битовых блоков (BitBlt). Image.DrawImageUnscaled() внутренне использует BitBlt, вот почему можно видеть огромное изображение, содержащее, возможно, миллионы пикселей (фотография из примера имеет 104975 пикселей) появляющимся почти мгновенно. Если бы компьютер должен был копировать изображение на экран пиксель за пикселем, то изображение постепенно появлялось бы в течение нескольких секунд.

Метод BitBlt очень эффективен, поэтому почти все операции рисования и манипуляции с изображениями выполняются с его помощью. Даже некоторое редактирование изображений будет делаться с помощью BitBlt, перенося части изображений между контекстами устройств, которые представляют области памяти. При использовании GDI функция BitBlt() из API Windows 32 была, наверное, самой важной и широко используемой функцией для манипуляции изображениями, хотя в GDI+ операции BitBlt по большей части скрыты объектной моделью GDI+.

Невозможно использовать BitBlt для областей, которые не являются прямоугольными, что можно легко смоделировать. Один из способов состоит в пометке некоторого цвета как прозрачного для целей BitBlt поэтому данная область цвета в изображении-источнике не будет перезаписывать существующий цвет соответствующего пикселя на получающем устройстве. Можно также определить, что в процессе выполнения BitBlt каждый пиксель получающегося изображения будет сформирован перед BitBlt некоторой логической операцией (такой, как побитовое AND) на цветах этого пикселя в изображении-источнике и в получающем устройстве. Такие операции поддерживаются аппаратным ускорителем и могут использоваться для задания ряда тонких эффектов. Не рассматривая детали процесса, отметим что объект Graphics реализует другой метод DrawImage(). Он аналогичен методу DrawImageUnscaled(), но поставляется с большим числом перезагружаемых версий, которые позволяют определить более сложные формы BitBlt для использования в процессе рисования. DrawImage() позволяет также рисовать (BitBlt) только определенную часта изображения, или выполнить на нем некоторые другие операции, такие как масштабирование (увеличение или уменьшение размера) при его рисовании.

Рисование текста

Мы отложили рисование текста на экране до этого момента, так как эта очень важная тема является в целом более сложной задачей, чем рисование графики. Необходимо уточнить это утверждение. Вывод одной или двух строк текста без учета их вида является очень простым, требуя вызова одного из методов экземпляра Graphics, Graphics.DrawString(). Однако при попытке вывести документ, содержащий большое количество текста, быстро обнаруживается значительное усложнение процесса. Это обусловлено двумя причинами:

□ Первое: для получения аккуратного изображения необходимо понимать шрифты. Там, где для рисования фигуры используются кисти и перья в качестве вспомогательных объектов, процесс рисования текста требует соответственно шрифтов в качестве вспомогательных объектов. Понимание шрифтов является не простой задачей. В следующем разделе будет предоставлено краткое введение в предмет. Заметим, однако, что детали шрифтов являются более сложными, чем кистей и перьев.

□ Второе: текст необходимо очень аккуратно разместить в окне. Пользователя обычно ожидают слова, которые естественно следуют одно за другим выровненными с пробелами между словами. Сделать это труднее, чем кажется. Обычно заранее неизвестно, сколько места на экране потребуется для слова (в отличие от фигуры). Это должно вычисляться (не беспокойтесь, это не придется делать вручную, так как существует метод Graphics.MeasureString(), который это сделает). Также пространство занимаемое словом на экране, будет влиять на местоположение каждого последующего слова документа. Если приложение выполняет перенос строк, то ему придется тщательно оценивать размеры слов, прежде чем решить, где поместить разрыв. Посмотрев внимательно на работу Word for Windows, можно заметить, что Word непрерывно изменяет положение текста при вводе, изменении шрифта, вырезании, вставке, и т. д. При этом выполняется большая обработка, включающая некоторые очень тщательно отработанные алгоритмы. Конечно, проектируемое приложение GDI+ не обязательно должно быть таким же сложным, как Word, но если потребуется вывести произвольный текст, то многие из таких же рассмотрений будут по-прежнему в силе. Поэтому конечная часть этой главы посвящена примеру, допускающему простые манипуляции с текстом, чтобы дать некоторое представление о проблемах, которые возникают в подобных приложениях, и об их возможных решениях.

Обработка текста с хорошим качеством не является невозможной, она просто сложна для правильного выполнения. Как было упомянуто ранее, реальный процесс вывода строки текста на экран при условии знания шрифта и места вывода трудности не представляет. Поэтому далее будет дан краткий пример, показывающий, как выводить фрагменты текста. В оставшейся части главы вы найдете обзор некоторых принципов Fonts и Font Families, прежде чем мы перейдем к более реалистичному примеру обработки текста CapsEditor, который продемонстрирует аспекты размещения текста на экране, а также покажет, как обрабатывать пользовательский ввод.

Простой пример с текстом

Пример является обычным результатом работы Windows Forms. В этот раз метод OnPaint() переопределяется следующим образом:

protected override void OnPaint(PaintEventArgs e) {

 Graphics dc = e.Graphics;

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату