重庆熊猫 Loading

.NET教程-GDI+

更新记录
转载请注明出处:
2022年10月9日 发布。
2022年10月5日 从笔记迁移到博客。

基础

GDI+介绍

GDI(Graphics Device Interface)图形设备接口

GDI是Windows API(Windows Programming Interface)的一个重要组成部分

GDI+(Graphics Device Interface Plus)增强图形设备接口

GDI+是GDI的升级版本

GDI+提供二维图形、图像处理等功能

GDI+是Windows操作系统提供图形图像操作应用程序编程接口(API)

使用GDI+可以用相同的方式在屏幕或打印机上显示信息,而无须考虑特定显示设备的细节

GDI+类提供程序员用以绘制的方法,这些方法随后会调用特定设备的驱动程序

GDI+将应用程序与图形硬件分隔,使程序员能够创建与设备无关的应用程序

GDI+就好像是一个绘图仪,它可以将已经制作好的图形绘制在指定的模板中

GDI+并可以对图形的颜色、线条粗细、位置等进行设置

GDI+体系结构图

image

GDI+命名空间

System.Drawing GDI+基本的图形处理

System.Drawing.Drawing2D 高级二维图形和矢量图形处理

System.Drawing.Imaging 高级图像处理

System.Drawing.Text 文本处理

System.Drawing.Printing 图形打印

System.Drawing.Design 开发UI设计时需要的类型

GDI+处理基本步骤

示意图

image

图像处理

支持的文件类型

BMP、GIF、JPEG、PNG、TIFF等,基本支持所有图片类型

主要类型

主要使用Image类、Bitmap类、Metafile类处理图片

Graphics类(画布)

说明

Graphics类封装了一个GDI+绘图画布

提供将对象绘制到显示设备的方法

Graphics与特定的设备相关

注意:如果不需要Graphics对象,需要释放

创建获得Graphics对象

通过WinForms窗体或控件的Paint事件获得Graphics对象

生成Paint事件

image

其作为PaintEventArgs的一部分,获得Graphics对象

在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用

private void Form1_Paint(object sender, PaintEventArgs e)
{
    //获得Graphics画布
    Graphics g = e.Graphics;
}

通过WinForms窗口或控件对象的CreateGraphics方法

private void addColumns_Click(object sender, EventArgs e)
{
    //获得Graphics画布
    Graphics g = this.CreateGraphics();
}

通过Graphics的FromImage静态方法

//创建图像对象
Image img = Image.FromFile("D:/test.jpg");
//创建Graphics画布
Graphics g = Graphics.FromImage(img);

释放Graphics对象

Image iamge = Image.FromFile(@"D:/test.jpg");
Graphics graphics = Graphics.FromImage(iamge);
//释放画布
graphics.Dispose();

获得水平分辨率

Image image = Image.FromFile(@"D:/test.jpg");
Graphics g = Graphics.FromImage(image);
//获得水平分辨率
float dipX = g.DpiX;
Console.WriteLine(dipX);

获得垂直分辨率

Image image = Image.FromFile(@"D:/test.jpg");
Graphics g = Graphics.FromImage(image);
//获得垂直分辨率
float dipY = g.DpiY;
Console.WriteLine(dipY);

清空图像

Image image = Image.FromFile(@"D:/test.jpg");
Graphics graphics = Graphics.FromImage(image);
//清空图像,并以颜色填充
graphics.Clear(Color.Red);

绘制直线

使用Graphics对象的DrawLine()方法

//获得画布对象
Graphics g = e.Graphics;
//新建画笔
Pen pen = new Pen(Color.Red);
//画线方法一,直接写入坐标
g.DrawLine(pen,10,10,100,100);
//画线方法二,使用点类型对象
Point p1 = new Point(100, 100);
Point p2 = new Point(200, 450);
g.DrawLine(pen,p1,p2);

绘制多条直线

使用Graphics对象的DrawLines()方法
//获得画布对象
Graphics g = e.Graphics;
//新建画笔
Pen pen = new Pen(Color.Red, 10);
//定义多个点
Point[] points = new Point[]{
    new Point(1,1),
    new Point(50,100),
    new Point(199,200)
};
//绘制直线
g.DrawLines(pen, points);

绘制多边形(空心)

使用Graphics对象的DrawPolygon()方法

//获得画布对象
Graphics g = e.Graphics;
//新建画笔
Pen pen = new Pen(Color.Red, 5);
//新建点组
Point[] points = new Point[] {
    new Point(200,200),
    new Point(300,400),
    new Point(100,400)
};
//绘制多边形
g.DrawPolygon(pen,points);

绘制多边形(实心)

使用Graphics对象的FillPolygon()方法
注意:实心图需要使用画刷

//获得画布对象
Graphics g = e.Graphics;
//新建笔刷
Brush brush = new SolidBrush(Color.Red);
//新建点组
Point[] points = new Point[] {
    new Point(200,200),
    new Point(300,400),
    new Point(100,400)
};
//绘制多边形
g.FillPolygon(brush, points);

绘制曲线

使用Graphics对象的DrawCurve()方法

DrawCurve(Pen pen,Point[] points)   //使用默认的0.5曲度
DrawCurve(Pen pen,Point[] points, float tension)   //指定曲度,取值范围:0.0~1.0f
//获得画布对象
Graphics g = e.Graphics;
//新建笔
Pen pen = new Pen(Color.Red, 5);
//新建点组
Point[] points = new Point[] {
    new Point(200,200),
    new Point(300,400),
    new Point(100,400),
    new Point(200,200)
};
//绘制多边形
g.DrawCurve(pen, points);
//g.DrawCurve(pen, points,1F);

绘制矩形(空心)

使用Graphics对象的DrawRectangle()方法
直接定制点

//获得画布对象
Graphics g = e.Graphics;
//新建笔
Pen pen = new Pen(Color.Red, 5);
//绘制多边形(空心)
g.DrawRectangle(pen,10,10,200,300);

使用预定的点

//获得画布对象
Graphics g = e.Graphics;

//新建笔
Pen pen = new Pen(Color.Red, 5);

//新建点组
Point point = new Point(100, 100);
Size size = new Size(200, 200);
Rectangle rectangle = new Rectangle(point,size);
//绘制多边形
g.DrawRectangle(pen, rectangle);

绘制多个矩形图形(空心)

使用DrawRectangles()

绘制曲线(封闭)

Image image = Image.FromFile(@"D:/test.jpg");
Graphics g = Graphics.FromImage(image);
//绘制封闭曲线
Pen pen = new Pen(Color.Red);
Point[] points = new Point[]{
    new Point(10,10),
    new Point(50,50),
    new Point(100,100)
};
g.DrawClosedCurve(pen, points);
g.Save();
image.Save(@"D:/test3.jpg");

绘制矩形(实心)

使用Graphics对象的FillRectangles()方法
注意:实心图需要使用画刷

//获得画布对象
Graphics g = e.Graphics;
//新建笔刷
Brush brush = new SolidBrush(Color.Red);
//绘制多边形(实心)
g.FillRectangle(brush, 20, 20, 300, 200);

使用预定的点

//获得画布对象
Graphics g = e.Graphics;

//新建笔
Brush brush = new SolidBrush(Color.Red);

//新建点组
Point point = new Point(100, 100);
Size size = new Size(200, 200);
Rectangle rectangle = new Rectangle(point,size);
//绘制多边形
g.FillRectangle(brush, rectangle);

绘制多个矩形图形(实心)

使用FillRectangles()

绘制椭圆(圆)(空心)

使用DrawEllipse()方法

//获得画布对象
Graphics g = e.Graphics;

//新建笔
Pen pen = new Pen(Color.Red, 5);

//定义参数
Point point = new Point(10, 10);
Size size = new Size(100, 100);
Rectangle rectangle = new Rectangle(point,size);
//绘制圆形(空心)
g.DrawEllipse(pen, rectangle);

绘制椭圆(圆)(实心)

使用FillEllipse()方法

//获得画布对象
Graphics g = e.Graphics;

//新建笔
Brush brush = new SolidBrush(Color.Red);

//定义参数
Point point = new Point(10, 10);
Size size = new Size(100, 100);
Rectangle rectangle = new Rectangle(point,size);
//绘制圆形(实心)
g.FillEllipse(brush, rectangle);

绘制文本

//获得画布
Graphics g = e.Graphics;
//绘制文本
string str = "https://www.Panda666.com";
Font font = new Font("微软雅黑", 18);
SolidBrush solidBrush = new SolidBrush(Color.Red);
Point point = new Point(50, 50);
Rectangle rectangle = new Rectangle(20, 20, 200, 200);
//绘制文本,指定字体,笔刷,左上角点
g.DrawString(str, font, solidBrush, point);
//绘制文本,指定字体,笔刷,左上角点
g.DrawString(str, font, solidBrush, 30,30);
//绘制文本,指定字体,笔刷,绘制区域
g.DrawString(str, font, solidBrush, rectangle);

绘制图像

Image image = Image.FromFile(@"D:/test.jpg");
Graphics g = Graphics.FromImage(image);
Image image1 = Image.FromFile(@"D:/test2.jpg");
//绘制图像
g.DrawImage(image1, new Point(1, 1));
g.Save();
image.Save(@"D:/test3.jpg");

绘制图像,并缩放到指定大小

Image image = Image.FromFile(@"D:/test.jpg");
Graphics g = Graphics.FromImage(image);
//绘制图像
Image image1 = Image.FromFile(@"D:/test2.jpg");
//绘制图像,并缩放到指定大小
g.DrawImageUnscaled(image1, new Point(1, 1));
g.Save();
image.Save(@"D:/test4.jpg");

绘制扇形

string filePath1 = @"C:\Users\Administrator\Downloads\1.png";
string fileSavePath = @"C:\Users\Administrator\Downloads\4.png";
//创建图像对象
Image img1 = Image.FromFile(filePath1);
Graphics g = Graphics.FromImage(img1);
//绘制扇形
SolidBrush solidBrush = new SolidBrush(Color.Red);
Rectangle rectangle = new Rectangle(10, 10, 200, 200);
g.DrawPie(solidBrush, rectangle, 30, 30);
g.Save();
img1.Save(fileSavePath);

绘制扇形(封闭)

Image image = Image.FromFile(@"D:/test.jpg");
Graphics g = Graphics.FromImage(image);
//绘制扇形(封闭)
SolidBrush solidBrush = new SolidBrush(Color.Red);
Rectangle rectangle = new Rectangle(10, 10, 200, 200);
g.FillPie(solidBrush, rectangle, 30, 30);
g.Save();
image.Save(@"D:/test3.jpg");

Color类(颜色)

说明

Color类表示一个颜色

系统预定义颜色

Color类本身预定义了许多的颜色,可以直接使用

//白色
Color c1 = Color.White;
//红色
Color c2 = Color.Red;
//黑色
Color c3 = Color.Black;

创建颜色

使用预定义颜色

Color c = Color.Red;

使用ARGB参数

//创建颜色
Color c1 = Color.FromArgb(255, 0, 0);
Color c2 = Color.FromArgb(100, 255, 255, 0);

Point结构(点)

说明

Point表示二位平面的一个点

创建一个点

//定义一个点
Point p = new Point(100, 100);

获得X轴坐标

//定义一个点
Point p = new Point(100, 100);
//获得X轴坐标
Console.WriteLine(p.X);

获得Y轴坐标

//定义一个点
Point p = new Point(100, 100);
//获得Y轴坐标
Console.WriteLine(p.Y);

Size结构(尺寸)

说明

表示一个二维平面的一个大小,包含长宽

定义一个大小尺寸

//定义一个尺寸
Size s = new Size(100, 100);

获得尺寸的宽度

//定义一个尺寸
Size s = new Size(100, 100);
//获得尺寸的宽度
Console.WriteLine(s.Width);

获得尺寸的高度

//定义一个尺寸
Size s = new Size(100, 100);
//获得尺寸的高度
Console.WriteLine(s.Height);

Rectangle结构(矩形)

说明

表示一个矩形

定义一个矩形

//直接定义
Rectangle r1 = new Rectangle();
//使用点和尺寸
Point point = new Point(100, 100);
Size size = new Size(100, 100);
Rectangle r2 = new Rectangle(point,size);
//指定位置和长宽
Rectangle r3 = new Rectangle(100, 100, 100, 100);

Pen类(画笔)

说明

表示一个画笔

定义笔

//定义笔并设置颜色
Pen pen1 = new Pen(Color.Red);
//定义笔并设置颜色并设置宽度
Pen pen2 = new Pen(Color.Red, 100);
//定义笔使用画刷初始化
SolidBrush sb = new SolidBrush(Color.Red);
Pen pen3 = new Pen(sb);
//定义笔并设置宽度使用画刷初始化
Pen pen4 = new Pen(sb, 100);

设置笔的颜色

Pen pen1 = new Pen(Color.Black);
//设置颜色
pen1.Color = Color.White;

设置笔的宽度

Pen pen1 = new Pen(Color.Black);
//设置宽度
pen1.Width = 100;

Brush类(画刷)

说明

Brush类是一个抽象类,表示画刷,常用于填充其他图形

具体的继承类有:

SolidBrush(实体画刷)

HatchBrush(阴影画刷)

TextureBrush(纹理画刷)

LinearGradientBrush(线性渐变画刷)

PathGradientBrush(径向渐变画刷)

SolidBrush(实体画刷)

说明

实体画刷,用于在画布上进行填充图形

命名空间:System.Drawing;

创建实体画刷

//创建画刷,附带画刷颜色
SolidBrush solidBrush1 = new SolidBrush(Color.Red);

HatchBrush(阴影画刷)

说明

阴影画刷,用于在画布上进行填充图形

用预设的画刷样式进行填充

命名空间:System.Drawing.Drawing2D;

创建阴影画刷

//创建画刷,附带阴影类型和颜色
HatchBrush hatchBrush = new HatchBrush(HatchStyle.LargeCheckerBoard, Color.Red);

可取的阴影枚举值

image

image

image

image

TextureBrush(纹理画刷)

说明

纹理画刷,使用图案填充图形,可以使用自定义的图形

命名空间:System.Drawing.Drawing2D;

创建纹理画刷

//设置图像信息
string filePath = @"D:/test.bmp";
Image image = Image.FromFile(filePath);
//用图像初始化纹理画刷
TextureBrush textureBrush1 = new TextureBrush(image);

设置边框

//设置图像信息
string filePath = @"D:/test.bmp";
Image image = Image.FromFile(filePath);
//设置边框信息
Rectangle rectangle1 = new Rectangle(10, 10, 20, 20);
//用图像初始化纹理画刷,并设置边框
TextureBrush textureBrush2 = new TextureBrush(image, rectangle1);

设置纹理平铺方式

//设置图像信息
string filePath = @"D:/test.bmp";
Image image = Image.FromFile(filePath);
//设置边框信息
Rectangle rectangle1 = new Rectangle(10, 10, 20, 20);
//用图像初始化纹理画刷
TextureBrush textureBrush1 = new TextureBrush(image,WrapMode.TileFlipXY);

支持的平铺方式

image

LinearGradientBrush(线性渐变画刷)

说明

线性渐变画刷类似实心画刷,但它基于两种颜色,两端使用不同的颜色,中间是渐变

命名空间:System.Drawing.Drawing2D;

创建线性渐变画刷

使用点和颜色

//创建画刷
Point point1 = new Point(10, 10);
Point point2 = new Point(200, 200);
LinearGradientBrush linearGradientBrush1 = new LinearGradientBrush(point1,point2,Color.Red,Color.Blue);

使用矩形和颜色

//创建画刷
Rectangle rectangle1 = new Rectangle(10, 10, 200, 200);
LinearGradientBrush linearGradientBrush2 = new LinearGradientBrush(rectangle1, Color.Blue, Color.Green, 2);

使用矩形和颜色和渐变方向

//创建画刷
Rectangle rectangle1 = new Rectangle(10, 10, 200, 200);
LinearGradientBrush linearGradientBrush3 = new LinearGradientBrush(rectangle1, Color.Cyan, Color.AntiqueWhite, LinearGradientMode.Horizontal);

支持的渐变方向

image

PathGradientBrush(径向渐变画刷)

说明

径向渐变画刷类似线性渐变画刷,只是

命名空间:System.Drawing.Drawing2D;

创建径向渐变画刷

创建画刷,设置填充区域

//创建画刷,设置填充区域
GraphicsPath graphicsPath = new GraphicsPath();
graphicsPath.AddRectangle(g.VisibleClipBounds);
PathGradientBrush pathGradientBrush1 = new PathGradientBrush(graphicsPath);
pathGradientBrush1.CenterColor = Color.Red;
pathGradientBrush1.SurroundColors = new Color[] { Color.Green, Color.Blue };

Font类(字体)

说明

Font类定义文本格式,包括字体、字号、样式等属性

支持的样式:

FontStyleBold(加粗)
FontStyleItalic(倾斜粗)
FontStyleRegular(正常)

支持的字体尺寸:

UnitDisplay(1/72英寸)
UnitPixel(像素)
UnitPoint(点)
UnitDocument(1/300英寸)
UnitMillimeter(毫米)

创建新的字体

//设置字体和字号
FontFamily fontFamily = new FontFamily("微软雅黑");
Font font1 = new Font(fontFamily, 30);
//设置字体和字号和字体风格
Font font2 = new Font(fontFamily, 30, FontStyle.Bold);
//从已有的字体生成新字体,设置字体风格
Font font3 = new Font(font1, FontStyle.Bold);
//设置字体和字号
Font font4 = new Font("微软雅黑", 30);
//设置字体、字号、风格、显示模式
Font font5 = new Font("微软雅黑", 30, FontStyle.Bold, GraphicsUnit.Point);

Bitmap类(位图)

说明

主要用于处理像素数据定义的图像

命名空间:System.Drawing

常用属性

image

常用方法

image

创建Bitmap对象

//创维位图,设定位图大小
Bitmap bitmap1 = new Bitmap(100,100);

//创维位图,使用Image
Image image = Image.FromFile(@"D:/test.jpg");
Bitmap bitmap2 = new Bitmap(image);

//创建位图,使用文件路径
Bitmap bitmap3 = new Bitmap(@"D:/test.jpg");

//创建位图,使用文件流
FileStream fileStream = new FileStream(@"D:/test.jpg", FileMode.CreateNew);
Bitmap bitmap4 = new Bitmap(fileStream);

//创建位图,使用图片并设置大小
Image image2 = Image.FromFile(@"D:/test.jpg");
Bitmap bitmap5 = new Bitmap(image,new Size(100,100));

//创建位图,使用文件流并校正
FileStream fileStream2 = new FileStream(@"D:/test.jpg", FileMode.CreateNew);
Bitmap bitmap6 = new Bitmap(fileStream2, true);

//创建位图,使用文件路径并校正
Bitmap bitmap7 = new Bitmap(@"D:/test.jpg", true);

获得图片宽度

Bitmap bitmap = new Bitmap(@"D:/test.jpeg");
//获得图片宽度
Console.WriteLine(bitmap.Width);

获得图片高度

Bitmap bitmap = new Bitmap(@"D:/test.jpeg");
//获得图片高度
Console.WriteLine(bitmap.Height);

获得图片的大小

Bitmap bitmap = new Bitmap(@"D:/test.jpeg");
//获得图片的大小
Size size = bitmap.Size;

获得图片原始格式

Bitmap bitmap = new Bitmap(@"D:/test.jpeg");
//获得图片原始格式
Console.WriteLine(bitmap.RawFormat);

获得图片像素格式

Bitmap bitmap = new Bitmap(@"D:/test.jpeg");
//获得图片像素格式
Console.WriteLine(bitmap.PixelFormat);

获得指定像素点的颜色

Bitmap bitmap = new Bitmap(@"D:/test.jpeg");
//获得指定像素点的颜色
Color color = bitmap.GetPixel(10, 10);

设置指定像素点的颜色

Bitmap bitmap = new Bitmap(@"D:/test.jpeg");
//设置指定像素点的颜色
bitmap.SetPixel(10,10,Color.Red);

Image(图像)

说明

表示一个图像

创建图像

//创建图像,从文件路径创建
Image image1 = Image.FromFile(@"D:/test.jpg");
//创建图像,从文件流
FileStream fileStream = new FileStream(@"D:/test.jpg", FileMode.CreateNew);
Image image2 = Image.FromStream(fileStream);

释放图像

Image image1 = Image.FromFile(@"D:/test.jpg");
image1.Dispose();

保存图像到文件

Image image = Image.FromFile(@"D:/test.jpg");
//保存文件,使用文件路径
image.Save(@"D:/test.jpg");

//保存文件,使用文件路径、指定格式
image.Save(@"D:/test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

//保存文件,使用文件流、指定格式
FileStream fileStream = new FileStream(@"D:/test.jpg", FileMode.CreateNew);
image.Save(fileStream, System.Drawing.Imaging.ImageFormat.Jpeg);

实例

图片添加图片水印

效果

image

代码

string filePath1 = @"C:\Users\Administrator\Downloads\1.png";
string filePath2 = @"C:\Users\Administrator\Downloads\2.png";
string fileSavePath = @"C:\Users\Administrator\Downloads\3.png";
//创建图像对象
Image img1 = Image.FromFile(filePath1);
Image img2 = Image.FromFile(filePath2);
//创建Graphics画布
Graphics g = Graphics.FromImage(img1);

//绘制子图形
g.DrawImage(img2,new Point(100,100));

//保存图像
img1.Save(fileSavePath);
img1.Dispose();
img2.Dispose();

绘图软件

效果

image

代码

注意:先拖拽PictureBox、Button到Form中

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// 图片画布
        /// </summary>
        private Graphics pictureBoxGraphices;

        /// <summary>
        /// 绘制的点
        /// </summary>
        private Point drawingPoint = new Point();

        /// <summary>
        /// 是否正在绘制中
        /// </summary>
        private bool IsDrawingNow = false;
        public Form1()
        {
            InitializeComponent();
            //初始化图片画布
            this.pictureBoxGraphices = this.pictureBox1.CreateGraphics();
        }

        /// <summary>
        /// 重绘
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //重置并绘制
            this.pictureBox1.Refresh();
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Left)
            {
                //设置为正在绘图
                this.IsDrawingNow = true;
                //设置绘制起点
                this.drawingPoint.X = e.X;
                this.drawingPoint.Y = e.Y;
            }
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if(this.IsDrawingNow)
            {
                Pen pen = new Pen(Color.Red);
                //绘制直线
                this.pictureBoxGraphices.DrawLine(pen, this.drawingPoint.X, this.drawingPoint.Y, e.X, e.Y);
                //重置绘制起点
                this.drawingPoint.X = e.X;
                this.drawingPoint.Y = e.Y;
            }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            //设置为正在绘图
            this.IsDrawingNow = false;
        }
    }
}
posted @ 2022-10-09 09:30  重庆熊猫  阅读(273)  评论(0编辑  收藏  举报