.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+体系结构图#
GDI+命名空间#
System.Drawing GDI+基本的图形处理
System.Drawing.Drawing2D 高级二维图形和矢量图形处理
System.Drawing.Imaging 高级图像处理
System.Drawing.Text 文本处理
System.Drawing.Printing 图形打印
System.Drawing.Design 开发UI设计时需要的类型
GDI+处理基本步骤#
示意图#
图像处理#
支持的文件类型#
BMP、GIF、JPEG、PNG、TIFF等,基本支持所有图片类型
主要类型#
主要使用Image类、Bitmap类、Metafile类处理图片
Graphics类(画布)#
说明#
Graphics类封装了一个GDI+绘图画布
提供将对象绘制到显示设备的方法
Graphics与特定的设备相关
注意:如果不需要Graphics对象,需要释放
创建获得Graphics对象#
通过WinForms窗体或控件的Paint事件获得Graphics对象#
生成Paint事件
其作为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);
可取的阴影枚举值#
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);
支持的平铺方式#
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);
支持的渐变方向#
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
常用属性#
常用方法#
创建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);
实例
图片添加图片水印#
效果#
代码#
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();
绘图软件#
效果#
代码#
注意:先拖拽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;
}
}
}
作者:重庆熊猫
出处:https://www.cnblogs.com/cqpanda/p/16767964.html
版权:本作品采用「不论是否商业使用都不允许转载,否则按3元1字进行收取费用」许可协议进行许可。
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16767964.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!