You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过统一Graphics对象生成.PS、.SVG、.PNG?.NET是否有类似Java Graphics2D的实现?

在.NET中实现统一Graphics对象生成多格式输出的方案

当然有!.NET生态里确实有类似Java Graphics2D的机制,能让你用统一的绘制逻辑生成多种栅格和矢量格式的文件,我给你拆解下具体方案:

1. 原生.NET库实现(支持栅格+部分矢量格式)

.NET的System.Drawing命名空间(.NET Core/.NET 5+需要安装System.Drawing.Common NuGet包)提供了Graphics类,你可以基于它完成统一绘制,再输出不同格式:

栅格格式(PNG/JPG/BMP等)

通过Bitmap作为绘制载体,绘制完成后直接保存为对应栅格格式:

using System.Drawing;
using System.Drawing.Imaging;

// 创建指定尺寸的Bitmap作为画布
using var bitmap = new Bitmap(800, 600);
using var g = Graphics.FromImage(bitmap);

// 统一绘制逻辑(这里可以抽成独立方法)
g.Clear(Color.White);
g.DrawLine(Pens.Black, 50, 50, 750, 550);
g.DrawString("统一绘制示例", new Font("Segoe UI", 16), Brushes.DarkBlue, 200, 200);

// 保存为PNG格式
bitmap.Save("output.png", ImageFormat.Png);
// 也可以保存为JPG/BMP等
// bitmap.Save("output.jpg", ImageFormat.Jpeg);

原生矢量格式(EMF/WMF)

.NET原生支持增强型图元文件(EMF)和Windows图元文件(WMF),这两种是矢量格式,你可以用Metafile作为载体:

using System.Drawing;
using System.Drawing.Imaging;

// 创建Metafile作为矢量画布
using var mf = new Metafile("output.emf", new RectangleF(0, 0, 800, 600).ToRectangle());
using var g = Graphics.FromImage(mf);

// 复用同样的绘制逻辑
g.Clear(Color.White);
g.DrawLine(Pens.Black, 50, 50, 750, 550);
g.DrawString("统一绘制示例", new Font("Segoe UI", 16), Brushes.DarkBlue, 200, 200);

// Metafile会自动保存到指定路径,无需额外Save调用

2. 输出SVG矢量格式(第三方库方案)

原生.NET没有直接支持SVG的Graphics类,但可以用成熟的第三方库实现类似的统一绘制体验:

方案一:SkiaSharp(跨平台推荐)

SkiaSharp是Google Skia图形库的.NET绑定,支持跨平台,能直接绘制并导出SVG:

using SkiaSharp;

// 创建SVG画布
using var svg = new SKSvg();
svg.Canvas.Scale(1); // 适配缩放
svg.Canvas.Clear(SKColors.White);

// 统一绘制逻辑(API和System.Drawing.Graphics类似,学习成本低)
svg.Canvas.DrawLine(50, 50, 750, 550, new SKPaint { Color = SKColors.Black, StrokeWidth = 2 });
using var textPaint = new SKPaint { Color = SKColors.DarkBlue, TextSize = 16 };
svg.Canvas.DrawText("统一绘制示例", 200, 200, textPaint);

// 保存为SVG文件
using var fs = File.OpenWrite("output.svg");
svg.Save(fs);

方案二:SharpVectors

SharpVectors专门面向SVG,支持将System.Drawing.Graphics的绘制操作转换为SVG,适合已经有基于Graphics的代码的场景:

using SharpVectors.Runtime;
using System.Drawing;

// 创建SVG渲染器
using var renderer = new SvgRenderer();
renderer.BeginRender(new Size(800, 600));

// 用System.Drawing.Graphics的API绘制
var g = renderer.Graphics;
g.Clear(Color.White);
g.DrawLine(Pens.Black, 50, 50, 750, 550);
g.DrawString("统一绘制示例", new Font("Segoe UI", 16), Brushes.DarkBlue, 200, 200);

// 结束渲染并保存SVG
renderer.EndRender();
renderer.SvgDocument.Save("output.svg");

3. 封装统一绘制逻辑

为了彻底实现“一次编写,多格式输出”,你可以把绘制逻辑抽成独立方法,甚至定义一个抽象接口来适配不同的画布类型:

// 抽象绘制接口
public interface ICanvasDrawer
{
    void DrawContent();
}

// 基于System.Drawing.Graphics的实现
public class GdiDrawer : ICanvasDrawer
{
    private readonly Graphics _g;
    public GdiDrawer(Graphics g) => _g = g;

    public void DrawContent()
    {
        _g.Clear(Color.White);
        _g.DrawLine(Pens.Black, 50, 50, 750, 550);
        _g.DrawString("统一绘制示例", new Font("Segoe UI", 16), Brushes.DarkBlue, 200, 200);
    }
}

// 基于SkiaSharp的实现
public class SkiaDrawer : ICanvasDrawer
{
    private readonly SKCanvas _canvas;
    public SkiaDrawer(SKCanvas canvas) => _canvas = canvas;

    public void DrawContent()
    {
        _canvas.Clear(SKColors.White);
        _canvas.DrawLine(50, 50, 750, 550, new SKPaint { Color = SKColors.Black, StrokeWidth = 2 });
        using var textPaint = new SKPaint { Color = SKColors.DarkBlue, TextSize = 16 };
        _canvas.DrawText("统一绘制示例", 200, 200, textPaint);
    }
}

这样不管输出哪种格式,只需要实例化对应的Drawer并调用DrawContent()即可,完全复用绘制逻辑。


内容的提问来源于stack exchange,提问作者David Thielen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:07:17