一、基础实现方案(WinForms + GDI+)
1. 核心架构设计
public class DrawingBoard : Form
{
private Bitmap _canvas;
private Graphics _graphics;
private Pen _currentPen = new Pen(Color.Black, 2);
private Point _startPoint;
private List<Shape> _shapes = new List<Shape>();
public event EventHandler<Shape> ShapeAdded;
}
2. 关键功能实现
// 初始化画布
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_canvas = new Bitmap(ClientSize.Width, ClientSize.Height);
_graphics = Graphics.FromImage(_canvas);
_graphics.Clear(Color.White);
}
// 鼠标事件处理
protected override void OnMouseDown(MouseEventArgs e)
{
_startPoint = e.Location;
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
using (var tempCanvas = (Bitmap)_canvas.Clone())
{
Graphics g = Graphics.FromImage(tempCanvas);
g.DrawLine(_currentPen, _startPoint, e.Location);
_canvas = tempCanvas;
Invalidate();
}
_startPoint = e.Location;
}
}
// 绘制到屏幕
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawImage(_canvas, 0, 0);
}
3. 图形保存功能
public void SaveImage(string path)
{
using (var img = new Bitmap(_canvas))
{
img.Save(path, ImageFormat.Png);
}
}
二、进阶功能扩展
1. 形状工具支持
public enum ShapeType {
Line, Rectangle, Ellipse }
public class Shape
{
public ShapeType Type {
get; set; }
public Point Start {
get; set; }
public Point End {
get; set; }
public Pen BorderPen {
get; set; }
public Brush FillBrush {
get; set; }
}
// 绘制方法扩展
private void DrawShape(Shape shape)
{
using (GraphicsPath path = new GraphicsPath())
{
switch (shape.Type)
{
case ShapeType.Rectangle:
path.AddRectangle(new Rectangle(shape.Start, shape.End));
break;
case ShapeType.Ellipse:
path.AddEllipse(new Rectangle(shape.Start, shape.End));
break;
}
_graphics.DrawPath(shape.BorderPen, path);
if (shape.FillBrush != null)
_graphics.FillPath(shape.FillBrush, path);
}
}
2. 撤销/重做系统
private Stack<List<Shape>> _undoStack = new Stack<List<Shape>>();
private Stack<List<Shape>> _redoStack = new Stack<List<Shape>>();
public void Undo()
{
if (_undoStack.Count > 1)
{
_redoStack.Push(_undoStack.Pop());
_canvas = _undoStack.Peek().ToBitmap();
Invalidate();
}
}
public void Redo()
{
if (_redoStack.Count > 0)
{
_undoStack.Push(_redoStack.Pop());
_canvas = _undoStack.Peek().ToBitmap();
Invalidate();
}
}
3. 高级绘图特性
// 抗锯齿设置
_graphics.SmoothingMode = SmoothingMode.AntiAlias;
_graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
// 自定义光标
Cursor customCursor = new Cursor("pencil.cur");
customCursor.HotSpot = new Point(5, 5);
this.Cursor = customCursor;
三、跨平台解决方案
1. SkiaSharp实现(支持.NET Core)
using SkiaSharp;
public class SkiaCanvas : SKCanvasView
{
private SKPaint _paint = new SKPaint
{
Color = SKColors.Black,
StrokeWidth = 5,
Style = SKPaintStyle.Stroke
};
public override void OnPaintSurface(SKPaintSurfaceEventArgs e)
{
SKImageInfo info = e.Info;
SKSurface surface = e.Surface;
SKCanvas canvas = surface.Canvas;
canvas.Clear(SKColors.White);
canvas.DrawLine(100, 100, 300, 300, _paint);
}
}
2. ImageSharp图像处理
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
public void ProcessImage(string path)
{
using (Image<Rgba32> image = Image.Load(path))
{
image.Mutate(ctx => ctx
.Resize(800, 600)
.ApplyFilter(new GaussianBlur(5))
);
image.Save("output.jpg");
}
}
四、专业功能实现
1. 图层管理系统
public class Layer
{
public string Name {
get; set; }
public Bitmap Content {
get; set; }
public bool IsVisible {
get; set; }
public float Opacity {
get; set; }
}
public class LayerManager
{
private List<Layer> _layers = new List<Layer>();
public void AddLayer(string name)
{
_layers.Add(new Layer {
Name = name,
Content = new Bitmap(Width, Height),
IsVisible = true
});
}
}
2. 路径动画系统
public class PathAnimator
{
private GraphicsPath _path;
private float _progress;
public void Animate(PointF startPoint, PointF endPoint, int durationMs)
{
_path = new GraphicsPath();
_path.AddLine(startPoint, endPoint);
var timer = new Timer(10);
timer.Elapsed += (s, e) => {
_progress += 1.0f / (durationMs / 10);
if (_progress > 1) _progress = 1;
Invalidate();
};
timer.Start();
}
}
五、优化与调试技巧
1. 性能优化方案
// 双缓冲设置
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer, true);
// 区域重绘
protected override void OnMouseMove(MouseEventArgs e)
{
Invalidate(new Rectangle(_startPoint, e.Location));
}
2. 调试工具集成
// 内存泄漏检测
public static void CheckMemoryLeaks()
{
var leakDetector = new LeakDetector();
leakDetector.StartMonitoring();
}
// 性能分析
public void ProfileDrawing()
{
var sw = Stopwatch.StartNew();
// 执行绘图操作
sw.Stop();
Debug.WriteLine($"绘制耗时: {sw.ElapsedMilliseconds}ms");
}
六、扩展功能建议
1. 专业功能模块
// 贝塞尔曲线工具
public void DrawBezier(Point start, Point control1, Point control2, Point end)
{
_graphics.DrawBezier(_currentPen, start, control1, control2, end);
}
// 文字绘制工具
public void DrawText(string text, PointF position)
{
_graphics.DrawString(text, _font, _brush, position);
}
2. 交互增强方案
// 橡皮擦工具
public void Erase(Point position)
{
using (SolidBrush brush = new SolidBrush(BackColor))
{
_graphics.FillEllipse(brush, position.X-5, position.Y-5, 10, 10);
}
}
// 取色器工具
public Color GetColorAt(Point position)
{
using (Bitmap bmp = new Bitmap(1, 1))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(position, Point.Empty, new Size(1, 1));
}
return bmp.GetPixel(0, 0);
}
}
七、项目结构建议
DrawingApp/
├── Models/
│ ├── Shape.cs
│ ├── Layer.cs
│ └── ColorScheme.cs
├── Views/
│ ├── MainForm.cs
│ └── ToolPalette.cs
├── Controllers/
│ ├── DrawingController.cs
│ └── LayerController.cs
└── Resources/
├── Brushes/
└── Fonts/
八、推荐开发工具代码
- Visual Studio 2022:集成调试与性能分析工具
- JetBrains Rider:跨平台.NET开发IDE
- Paint.NET:辅助设计界面原型
- dotPeek:反编译分析现有画图工具
- C# 画图工具源码:www.youwenfan.com/contentald/92612.html