Замкнутые кривые (замкнутые сплайны) рисуются по тому же принципу, что и многоугольники, т.е. задается перо или кисть, а также набор точек, через которые должна пройти кривая. Для этого используются методы DrawClosedCurve и FillClosedCurve, например:
Visual Basic .Net:
Dim g As Graphics
g = Me.CreateGraphics
Dim redpen As Pen
redpen = New Pen(Color.Red, 3)
Dim points As Point() = {New Point(10, 10), New Point(10, 100),New Point(200, 50), New Point(250, 300)}
g.DrawClosedCurve(redpen, points)
Visual C#:
Graphics g;
g = this.CreateGraphics();
Pen redpen;
redpen = new Pen(Color.Red, 3);
Point[] points = { new Point(10, 10), new Point(10, 100), new Point(200, 50), new Point(250, 300) };
g.DrawClosedCurve(redpen, points);
Изображения выводятся в заданной области объекта Graphics с помощью метода DrawImage. Само изображение задаётся с помощью объекта Image также, как и при создании объекта PictureBox. Метод DrawImage имеет несколько форм. Самой простой формой прорисовки изображения является задание координат его левого верхнего угла и размеров, например:
Visual Basic .Net:
Dim img As Image
img = Image.FromFile("C\pic1.jpg")
Dim g As Graphics
g = Me.CreateGraphics
g.DrawImage(img, 0, 0, 200, 200)
Visual C#:
Image img;
img = Image.FromFile("C:\\pic1.jpg");
Graphics g;
g = this.CreateGraphics();
g.DrawImage(img, 0, 0, 200, 200);
Этот код рисует заданное изображение размером 200 х 200 пикселей, начиная с левого верхнего угла формы. Если размеры изображения в объекте Imageне соответствуют третьему и четвёртому аргументам объекта DrawImage, то изображение увеличивается или уменьшается. Вообще третий и четвёртый аргументы данного метода не являются обязательными, если они не указаны, то изображение создается в своих реальных размерах, а в случае, если размеры объекта, на котором оно рисуется, меньше, то изображение обрезается.
Можно рисовать изображение в заданном прямоугольнике, например:
Visual Basic .Net:
Dim img As Image
img = Image.FromFile("C\pic1.jpg")
Dim g As Graphics
g = Me.CreateGraphics
Dim r1 AsNew Rectangle(100, 100, 100, 100)
g.DrawImage(img, r1)
Visual C#:
Image img;
img = Image.FromFile("C:\\pic1.jpg ");
Graphics g;
g = this.CreateGraphics();
Rectangle r1 = new Rectangle(100, 100, 100, 100);
g.DrawImage(img, r1);
Чтобы при этом не произошло искажение изображения, пропорции прямоугольника должны быть такими же, как пропорции изображения. Если размеры прямоугольника больше или меньше размеров изображения, то, как в предыдущем случае, оно увеличивается или уменьшается.
Третья форма метода DrawImage позволяет создать изображение, изменив его форму в виде параллелограмма. В качестве аргумента задаётся массив из трёх точек, соответствующих левому верхнему, правому верхнему и левому нижнему углам параллелограмма. Координаты правого нижнего угла вычисляются автоматически, например:
Visual Basic .Net:
Dim img AsImage
img = Image.FromFile("C\pic1.jpg")
Dim g As Graphics
g = Me.CreateGraphics
Dim points() As Point = {New Point(100, 100), New Point(550, 100), New Point(150, 250)}
g.DrawImage(img, points)
Visual C#:
Image img;
img = Image.FromFile("C:\\ pic1.jpg");
Graphics g;
g = this.CreateGraphics();
Point[] points = { new Point(100, 100), new Point(550, 100), new Point(150, 250) };
g.DrawImage(img, points);
Можно указать также часть рисунка, которую нужно вырезать и отобразить в заданном параллелограмме. Для этого задаются дополнительные аргументы, определяющие вырезаемый прямоугольник и единицы его измерения, например:
Visual Basic .Net:
Dim img As Image
img = Image.FromFile("C\pic1.jpg")
Dim g As Graphics
g = Me.CreateGraphics
Dim points() As Point = {New Point(100, 100), New Point(325, 100), New Point(150, 250)}
Dim r1 AsNew Rectangle(10, 10, 50, 50)
g.DrawImage(img, points,r1, GraphicsUnit.Pixel)
Visual C#:
Image img;
img = Image.FromFile("C:\\ pic1.jpg");
Graphics g;
g = this.CreateGraphics();
Point[] points = { new Point(100, 100), new Point(550, 100), new Point(150, 250) };
Rectangle r1 = new Rectangle(10, 10, 50, 50);
g.DrawImage(img, points, r1, GraphicsUnit.Pixel);
Этот код вырезает из изображения квадрат размером 50 х 50 пикселей, начиная с точки (10,10) и отображает его в параллелограмме, задаваемом точками массива points. Следует отметить, что параметры прямоугольника в данном случае относятся к изображению (т.е. к объекту Image), а не к объекту Graphics. Если задать размеры прямоугольника, равные размеру изображения, а координаты точки – (0,0), то изображение выведется таким же образом, как в предыдущем случае.
С помощью данного метода можно также управлять гаммой цветов изображения. Для этого используется аргумент атрибутов изображения, который определяется как объект ImageAttributes. У этого объекта имеется метод SerGamma, который и устанавливает гамму цветов. Гамма определяется как значение типа Single. По умолчанию значение гаммы равно 1, увеличение гаммы делает цвета более тёмными, уменьшение – более светлыми. Следует отметить, что понятия гаммы и яркости являются различными. При изменении гаммы учитывается весь диапазон цветов изображения, но при этом на разные цвета изменение гаммы влияет по разному, а также изменяется контрастность. Рассмотрим пример:
Visual Basic .Net:
Dim img As Image
img = Image.FromFile("C\pic1.jpg")
Dim g As Graphics
g = Me.CreateGraphics
Dim points() As Point = {New Point(100, 100), New Point(325, 100), New Point(150, 250)}
Этот код рисует фрагмент изображения также, как и в предыдущем случае, а также изменяет гамму цветов до значения 0.1, т.е. делает изображение достаточно бледным.
Использование метода DrawImage для рисования сложнее создания изображений на элементе PictureBox. Кроме этого, при его использовании, как и при рисовании с помощью других графических методов, необходимо учитывать возможность изменения размеров формы, многократного её вызова на экран и т.д. Однако и возможности данного метода значительно шире. Например, изображение можно выводить по частям, или постепенно изменяя его гамму цветов – от самого бледного до исходного.