Green-sell.info

Новые технологии
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

C system drawing point

Двумерная графика на C#, классы Graphics, Pen и Brush

На примере графики наглядно видны преимущества ООП, смысл использования классов, их методов и свойств. Добавляя в пространство имен своего проекта соответствующие библиотеки, вы получаете сразу набор инструментов, необходимых для графики. Это графические примитивы (линии, прямоугольники, эллипсы и т.п.), перо для черчения, кисть для закраски и много других полезных объектов и методов.

2D-графика делится, как вы знаете, на растровую и векторную. Растровое изображение — это набор цветных пикселей, заданных в прямоугольной области, хранящихся в файлах *.bmp, *.jpg, *.png и т.п. Самый простой растровый редактор — программа Paint. Векторная графика намного экономнее (по объемам памяти) растровой. Так для рисования прямоугольника достаточно задать координаты двух точек (левого верхнего и правого нижнего углов) и цвет и толщину линии. В этом разделе в основном рассмотрим методы векторной графики.

Пространство имен System.Drawing (Рисование) обеспечивает доступ к функциональным возможностям графического интерфейса GDI+ , используя около 50 (!) классов, в том числе класс Graphics. Чуть позже мы будем использовать дополнительные пространства имен System.Drawing.Drawing2D, System.Drawing.Imaging, System.Drawing.Printing, System.Drawing.Text, расширяющие функциональные возможности библиотеки System.Drawing.

Класс Graphics предоставляет методы рисования на устройстве отображения (другие термины — графический контекст, «холст»). Определимся сразу, на чем мы хотим рисовать. Далее в примерах он обозначается как объект g.

Способы задания «холста»

1. Графический объект — «холст» для рисования на форме Form1 (указатель this) можно задать, например, одним оператором:
Graphics g = this.CreateGraphics();
Примечание. Заметим, что стандартным образом
Graphics g = new Graphics();
создать объект-холст не удается.
На этом операторе генерируется ошибка:
Для типа «System.Drawing.Graphics» не определен конструктор.

2. Еще пример задания графического контекста на визуальном компоненте PictureBox (ящик для рисования) через растровый объект класса Bitmap. В классе Form1 зададим два объекта:
Graphics g; // графический объект — некий холст
Bitmap buf; // буфер для Bitmap-изображения
В конструктор Form1() добавим следующие операторы:
buf = new Bitmap(pictureBox1.Width, pictureBox1.Height); // с размерами
g = Graphics.FromImage(buf); // инициализация g

3. В принципе, иногда (если все графические операции выполняются внутри одной функции) эти четыре строки могут быть заменены одной строкой:
Graphics g = Graphics.FromImage(new Bitmap(pictureBox1.Width, pictureBox1.Height));
После этого можно задать фон холста белым:
g.Clear(Color.White);

4. Еще один пример задания «холста» на форме через дескриптор окна:
Graphics g = Graphics.FromHwnd(this.Handle);
Далее в примерах конкретизируются эти способы.

Объекты других классов из библиотеки System.Drawing

Такие классы, как Rectangle (прямоугольник) и Point (точка) инкапсулируют элементы GDI+. Отметим, что Point вообще то является структурой (struct) с полями x,y. Это уточнение несущественно, так как в C# структуры похожи на классы, a инициализация объекта-структуры point может выглядеть так же, как инициализация объекта-класса:
Point point= new Point();

Класс Pen (перо) используется для рисования линий и кривых, а классы, производные от класса Brush (кисть) используются для закраски замкнутых контуров (см. ниже).

Класс GraphicsPath позволяет задавать последовательность соединенных линий и кривых, класс Region описывает внутреннюю часть графической формы, состоящей из многоугольников и контуров.

Класс Image – абстрактный базовый класс предоставляет функциональные возможности для производных классов Bitmap и Metafile. Bitmap используется для работы с пиксельными изображениями (см. выше пример). Metafile определяет графический метафайл, содержащий записи, описывающие последовательность графических операций, которые могут быть записаны (созданы) и воспроизведены (отображается). Этот класс не наследуется.

Класс Graphics

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

Графика GDI+

Интерфейс GDI+ — это модель рисования общего назначения для приложений .NET. В среде .NET интерфейс GDI+ используется в нескольких местах, в том числе при отправке документов на принтер, отображения графики в Windows-приложениях и визуализации графических элементов на веб-странице.

Применение кода GDI+ для прорисовки графики — это более медленный процесс, чем использование файла статического изображения. Однако этот метод обеспечивает значительно большую свободу и предоставляет несколько возможностей, которые были недоступны (или являлись недопустимо сложными) в предшествующих платформах разработки веб-приложений, таких как классическая ASP. Например, можно генерировать графические элементы, которые используют специфичную для пользователя информацию, и «на лету» визуализировать диаграммы и графики в соответствии с записями базы данных.

Ядром программирования GDI+ является класс System.Drawing.Graphics. Класс Graphics инкапсулирует поверхность рисования GDI+, будь то окно, печатный документ или хранящееся в памяти растровое изображение. Разработчикам ASP.NET редко приходится рисовать окна или печатные документы, поэтому в веб-приложениях наибольшее применение находит последняя из названных возможностей.

Чтобы использовать GDI+ в среде ASP.NET, необходимо выполнить следующие четыре действия:

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

Создать графический контекст GDI+ для изображения. Выполнение этого действия предоставит экземпляр объекта System.Drawing.Graphics.

Выполнить рисование с помощью методов экземпляра объекта Graphics. Эти методы позволяют рисовать и закрашивать линии и формы, а также копировать содержимое растрового изображения из существующих файлов.

Записать изображение в браузер с помощью свойства Response.OutputStream.

В последующих разделах приводится несколько примеров веб-страниц, в которых используется GDI+. Прежде чем продолжить, удостоверьтесь в том, что импортированы следующие пространства имен:

В пространстве имен System.Drawing определены многие из основополагающих ингредиентов рисования, в том числе перья, кисти и растровые изображения. Пространство имен System.Drawing.Drawing2D добавляет другие полезные нюансы, такие как весьма гибкий класс GraphicsPath, а пространство имен System.Drawing.Imaging включает в себя пространство имен ImageFormat, позволяющее выбирать формат графики, в котором растровое изображение будет визуализировано при отправке клиенту.

Читать еще:  Обрезка фигуры в powerpoint

Простое рисование

В следующем примере демонстрируется простейшая страница GDI+. Вся необходимая работа выполняется в обработчике события Page.Load.

Прежде всего, нужно построить хранящееся в памяти растровое изображение, создав экземпляр класса System.Drawing.Bitmap. При создании этого объекта в аргументах конструктора потребуется указать высоту и ширину изображения в пикселях. Размер изображения должен быть как можно меньшим. Крупные растровые изображения будут не только потреблять больше дополнительной памяти сервера во время выполнения, но возрастет также и размер визуализированного содержимого, отправляемого клиенту, что замедлит передачу данных.

Затем нужно создать графический контекст GDI+ изображения, представленный объектом System.Drawing.Graphics. Методы этого объекта позволяют выполнять рисование в хранящемся в памяти растровом изображении. Чтобы создать объект Graphics из объекта Bitmap, используйте статический метод Graphics.FromImage().

Теперь начинается самое интересное. С помощью методов класса Graphics в растровом изображении можно нарисовать текст, формы и изображения. В этом примере код рисования чрезвычайно прост. Он заполняет графический элемент сплошным белым фоном, используя метод FillRectangle() объекта Graphics. (Первоначально в новом растровом изображении каждый пиксель устанавливается в черный цвет.)

Метод FillRectangle() требует нескольких аргументов. Первый аргумент устанавливает цвет, следующие два — начальную точку, а последние два — ширину и высоту. Точка (0, 0) определяет в пикселях верхний левый угол изображения в координатах (X, Y). Значение координаты X увеличивается слева направо, а координаты Y — сверху вниз. В этом примере изображение имеет ширину 300 пикселей и высоту 50 пикселей — т.е. нижним правым утлом является точка с координатами (299, 49).

Рамка толщиной в 1 пиксель оставлена незаполненной. В результате отображается тонкая рамка исходного черного цвета. Следующий фрагмент кода рисования визуализирует сообщение статической метки. Для этого создается объект System.Drawing.Font, представляющий используемый шрифт. Этот объект не следует путать с объектом FontInfo, который применяется с элементами управления ASP.NET для указания запрошенного кода веб-страницы. В отличие от FontInfo, объект Font представляет один конкретный шрифт (включая его гарнитуру, размер и стиль), установленный на текущем компьютере. При создании объекта Font нужно указать имя шрифта, его размер в пунктах и стиль, например:

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

Для визуализации текста служит метод DrawString() объекта Graphics. Как и в случае объекта FillRectangle, понадобится указать координаты точки, с которой должно начинаться рисование. Эта точка представляет верхний левый угол текстового блока. В данном случае используется точка (10, 5), что ведет к смещению текста на 10 пикселей от левого края и на 5 пикселей от верхнего края экрана:

Как только изображение готово, его можно оправить браузеру методом Bitmap.Save(). Изображение сохраняется в потоке ответа браузера. Оно отправляется клиенту и отображается в браузере. При записи непосредственно в поток ответа, как в данном примере, изображение заменяет любые другие данные веб-страниц и обходит модель веб-элемента управления:

Изображение можно сохранить в любой допустимый поток, включая FileStream. Эта технология позволяет сохранять динамически генерируемые изображения на диске, чтобы впоследствии их можно было использовать в других веб-страницах.

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

Чтобы сэкономить время можно использовать операторы using для классов реализующих IDisposable. Ниже показано сохранение графики в файл и отображение ее в элементе Image:

Формат и качество изображения

При сохранении изображения можно выбрать желаемый формат. Формат JPEG обеспечивает наилучшую поддержку цвета и графики, хотя он использует сжатие, которое может привести к утрате деталей и размытию текста. Часто для графических изображений, содержащих текст, больше подходит формат GIF, но он предлагает не слишком хорошую поддержку цвета. В среде .NET каждое GIF-изображение применяет фиксированную палитру, состоящую из 256 обобщенных цветов. При использовании цвета, который не совпадает с одним из этих заранее установленных цветов, он будет размыт, приводя к неоптимальному результату.

Еще одним возможный выбором является формат PNG, который сочетает в себе лучшие черты форматов JPEG и GIF. Однако этот формат не может работать непосредственно в веб-странице — его придется вставить внутрь дескриптора .

Качество определяется не только форматом изображения. Оно зависит также от способа визуализации исходного растрового изображения. GDI+ позволяет выбирать между оптимизацией кода рисования для улучшения внешнего вида или для повышения скорости. При выборе оптимизации для получения наилучшего внешнего вида .NET использует технологии визуализации, такие как сглаживание, для увеличения качества рисунка.

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

Чтобы использовать сглаживание в приложениях, потребуется установить свойство SmoothingMode объекта Graphics. На выбор доступны значения None (по умолчанию), Highspeed, AntiAlias и HighQuality (которое аналогично AntiAlias, но использует другой, более медленный алгоритм оптимизации, предназначенный для повышения качества изображения на жидкокристаллических экранах). Свойство Graphics.SmoothingMode — одно из немногих зависящих от состояния членов класса Graphics. Это означает, что его устанавливают перед началом рисования, и оно применяется к любому рисуемому тексту или формам до тех пор, пока объект Graphics не будет удален:

Наиболее наглядно сглаживание проявляется при отображении кривых. Это означает, что оно существенно улучшает внешний вид эллипсов, окружностей и дуг, но никак не сказывается на прямых линиях, квадратах и прямоугольниках:

Читать еще:  Как вставить ссылку в презентацию powerpoint

Сглаживание можно применять также к шрифтам, чтобы сгладить ступенчатость краев текстовых элементов. Чтобы гарантированно получить оптимизированный текст, можно установить свойство Graphics.TextRenderingHint. Для выбора доступны значения SingleBitPerPixelGridFit (наивысшая производительность и самое низкое качество), AntiAlias (хорошее качество благодаря сглаживанию), AntiAliasGridFit (более высокое качество благодаря сглаживанию и выводу подсказок, но более низкая производительность) и ClearTypeGridFit (наивысшее качество на жидкокристаллическом дисплее).

Или же можно использовать значение SystemDefault, чтобы применять любые настройки сглаживания шрифта, сконфигурированные пользователем. Настройка SystemDefault является настройкой по умолчанию, а системные настройки по умолчанию большинства компьютеров включают функцию сглаживания текста. Даже если эта настройка не установлена, как правило, динамически визуализированный текст будет рисоваться в высоком качестве. Однако, поскольку управление системными настройками веб-сервера возможно не всегда, если нужно рисовать текст в изображении, рекомендуется указывать эту настройку явно.

Класс Graphics

Класс Graphics также предоставляет методы для рисования определенных видов форм, изображений и текста. Эти методы кратко описаны в таблице ниже:

Работа с картами в Windows Form с использованием GMap.NET. Часть 2. : Справочник по C#

Данная инструкция является продолжением обзора компонента по работе с картами – «GMap.NET». По завершению работы с данной инструкцией в вашем проекте будет реализован функционал загрузки карты по определенным координатам, установка маркера и получение его координат, а так же замена стандартного маркера, который предоставляет компонент, на любое другое изображение в формате «*.png».
Для данной инструкции будет использован пример из первой части (Работа с картами в Windows Form с использованием GMap.NET) обзора данного компонента. Вы можете воспользоваться как тестовым примером или полностью выполнить первую инструкцию самостоятельно и плавно перейти к выполнению этой. Если вы воспользовались исходником из первой части обзора компонента «GMap.NET», метод загрузки главной формы «Form1_Load» будет содержать код установки двух маркеров (красный и зеленый) по координатам Красной площади в Москве, удалите данный код. У вас останется только часть инициализации карты по заданным координатам.

Далее необходимо добавить в проект класс, отвечающий за создание рамки при наведении на маркер и подстановки выбранного вами изображения в качестве маркера. Перейдите в Обозреватель решений и сделайте клик правой клавишей мыши по заголовку вашего проекта. В открывшемся контекстном меню перейдите в меню «Добавить -> Класс…» или выполните сочетание клавиш «Shift+Alt+C».

У вас откроется диалоговое окно «Добавление нового элемента» в котором вам будет предложено ввести имя создаваемого класса, введите имя «GMapMarkerImage» и нажмите кнопку «Добавить» расположенную в нижней части формы.

После выполнения этих действий, у вас автоматически откроется новая вкладка с только что созданным классом, так же класс появится в Обозревателе решений.

Приведите листинг данного класса в соответствии с полным кодом, который представлен ниже.

Данный класс расширяет функциональные возможности существующего класса «GMapMarker», путем создания нового класса, производного от существующего. Производный класс «GMapMarkerImage» наследует все свойства базового класса «GMapMarker», и добавляет новые методы и свойства в зависимости от необходимости.

Перейдите в листинг главной формы и перед методом загрузки главной формы «Form1_Load», объявите приведенные ниже переменные.

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

Далее необходимо добавить сами методы отображения изображения, координат и рамки маркера.

При инициализации элемента управления «gMapControl1», у свойства «DragButton» задано значение «MouseButtons.Left», указывающее, что перемещение карты осуществляется с использованием левой клавиши мыши. Поэтому установка маркера будет осуществляться с использованием правой клавишей мыши. Но его перемещение, как и карты, реализовано посредством левой клавиши мыши. Запустите проект, нажав на клавиатуре, клавишу «F5». Нажмите правой клавишей мыши на любом мечте карты, у вас появится маркер с заданным вами изображением, которое загружается из директории с исполняемым файлом вашего проекта.

При наведении курсора мыши на маркер вы увидите подсказку, содержащую его координаты на карте. Так же подсказка будет отображаться при перемещении маркера по карте, левой клавишей мыши.

Для изменения изображения маркера вам необходимо заменить изображение рядом с исполняемым файлом проекта на любое другое, соблюдая всего два критерия, изображение должно быть в формате «*.png» и названо «marker».

Пример использования графики [C#]

Пространство имен System.Drawing обеспечивает доступ к функциональным возможностям графического интерфейса GDI+ Windows. Класс Graphics предоставляет методы рисования на устройстве отображения.

Рассмотрим пример использования графических возможностей С# для метода DrawLine класса Graphics .

Задача: На форме, в модуле pictureBox посторить треугольник, заданный прямоугольными координатами вершин. Координаты должны быть заданы относительно pictureBox.

Рисование в pictureBox имеет то преимущество, что при сворачивании формы прорисованные объекты сохраняются. Если же рисовать непосредственно в поле формы, то этого не происходит.

  1. Создадим новый проект Windows Form
  2. Поместим на форме два контролла из панели инструментов: кнопку Button1 и окно для рисунка pictureBox1. Начальное положение и размеры этих объектов могут быть произвольными, далее программно мы их «причешем».
  3. Создадим в нашем коде функцию загрузки формы, для этого в конструкторе формы дважды щелкнем мышкой на поле формы – создастся процедура private void Form1_Load(object sender, System.EventArgs e)
  4. Создадим в нашем коде функцию- события одного щелчка по кнопке Button1, для этого в конструкторе формы дважды щелкнем мышкой на этой кнопке – создастся процедура private void button1_Click(object sender, EventArgs e).
  5. Создадим в нашем коде функцию- события рисования pictureBox1, для этого в конструкторе формы правой кнопкой мышки щелкнем на pictureBox1 и выберем «Свойства». В свойства pictureBox1 выберм вкладку «События» и выберм событие Paint, дважды щелкнем мышкой на этом элементе списка – создастся процедура private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  6. Далее дописываем код, как показано ниже. Все действия в программе откомментированы, надеюсь все понятно.
  7. Ключевой строчкой в коде является:
  8. pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
  9. Она связывает событие рисования на pictureBox1 с процедурой pictureBox1_Paint.
  10. Запускаем проект на выполнение и кликаем по кнопке «Построить».
Читать еще:  Как делать анимацию в powerpoint

Я вам код подсветил и некоторые неточности поправил.

Теперь разбор полетов:
Увидимши комментарий на аглицком (void button1_Click()), я задался вопросом: ваш ли это код?

Ежели не ваш — публикация чужого кода, в принципе, не запрещена, если вы будете следовать правилам, установленным владельцем кода, а также укажете источник. Прошу ответить в комментарии.

Код мой. Строчка с комментарием взята из другого примера.

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

pjp07, деградирует население 🙂

Если кому-то это будет интересно,то он обязан написать комментарии?И если тебе так хочется взламывать(и фигней страдать) то иди взламывай!

C system drawing point

C# для профессионалов

Для кого предназначена эта книга

Основные темы книги

Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.

В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.

Эта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.

• Все особенности языка C#

• C# и объектно-ориентированное программирование

• Приложения и службы Windows

• Создание web-страниц и web-служб с помощью ASP NET

• Доступ к данным при помощи ADO NET

• Создание распределённых приложений с помощью NET Remoting

• Интеграция с COM, COM+ и службой Active Directory

Книга: C# для профессионалов. Том II

Point и PointF

Рассмотрим сначала Point (точка) Эта структура концептуально является простейшей и математически полностью эквивалентна двумерному вектору. Она содержит два открытых целых свойства, которые представляют горизонтальное и вертикальное смещение от определенного места (возможно, на экране). Посмотрите на рисунок:

Чтобы перейти из точки А в точку В, необходимо сместиться на 20 единиц вправо и на 10 единиц вниз, помеченных как X и Y на рисунке, так как это обычное обозначение. Можно было бы создать структуру Point , которая представляет это, следующим образом:

Point АВ = new Point(20, 10);
Console.WriteLine(«Moved <0>across, <1>down», AB.X, AB.Y);

X и Y являются свойствами чтения-записи, а значит, можно также задать значения в Point следующим образом:

Point АВ = new Point();
AB.X = 20;
АВ.Y = 10;
Console.WriteLine(«Moved (0) across, (1) down», AB.X, AB.Y);

Отметим, что хотя обычно горизонтальные и вертикальные координаты обозначаются как координаты х и у (буквы нижнего регистра), соответствующие свойства Point обозначаются X и Y (буквами верхнего регистра), так как обычное соглашение в C# для открытых свойств требует, чтобы их имена начинались с букв верхнего регистра.

PointF по сути идентична Point , за исключением того, что X и Y имеют тип float вместо int . PointF используется, когда координаты не обязательно являются целыми значениями. Для этих структур определено преобразование типов, поэтому можно неявно преобразовывать из Point в PointF и явно из PointF в Point (последнее преобразование явное в связи с риском ошибок округления):

PointF ABFloat = new PointF(20.5F, 10.9F);
Point AB = (Point)ABFloat;
PointF ABFloat2 = AB;

Одно последнее замечание о координатах. В нашем обсуждении Point и PointF сознательно присутствует неопределенность в отношении единиц измерения. Можно говорить о 20 пикселях вправо и 10 пикселях вниз или о 20 дюймах, или 20 милях. Интерпретация координат полностью принадлежит разработчику.

По умолчанию GDI+ будет представлять единицы измерения как пиксели на экране (или принтере, в зависимости от графического устройства), именно таким образом методы объекта Graphics будут представлять любые координаты, которые передаются им в качестве параметров. Например, точка Point(20, 10) представляет 20 пикселей вправо по экрану и 10 пикселей вниз. Обычно эти пиксели измеряются от верхнего левого угла клиентской области окна, как было до сих пор в рассмотренных примерах. Но это не всегда так, в некоторых ситуациях может потребоваться нарисовать относительно верхнего левого угла всего окна (включая границу) или даже относительно верхнего левого угла экрана. В большинстве случаев, однако, если документация не говорит обратное, можно предполагать, что речь идет о пикселях относительно верхнего левого угла клиентской области.

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

Ссылка на основную публикацию
Adblock
detector