使用 ASP 页面进行图形渲染






4.10/5 (6投票s)
使用 ASP.NET/GDI+/C# 动态渲染 2D 图形
引言
在本文中,我将向您展示如何编写一个简单的 ASP.NET 页面,该页面可以动态渲染 PNG 图像。 如果您正在考虑编写一个 Web 绘图应用程序,本文将为您提供使用 ASP.NET/C# 和 Win32 GDI+ 渲染图形的基本技能。
背景
如果您正在开发 Windows 窗体 .NET 应用程序,将图形渲染到 Windows 窗体是相对简单的。 常见的技术是重写 Windows 窗体的 OnPaint() 方法,并使用 Graphics 对象绘制或渲染图形。 但是,如果您想在 Web/ASP.NET 应用程序上执行此操作,则并非易事。
以下示例显示了如何使用 GDI+ 图形库将图形渲染到 Bitmap 表面,并将图形渲染为 PNG 文件,并将 PNG 文件作为对 Web 请求的响应返回。
使用 GDI+ 渲染图形
以下函数显示了如何使用 GDI+ System.Drawing.Graphics 对象绘制基本形状。
/// <summary>
/// Draw rectangle
/// </summary>
private void DrawRectangle(Graphics g)
{
    g.Clear(Color.White);
    g.FillRectangle(Brushes.Blue, new Rectangle(0, 0, this.width, this.height));
}
/// <summary>
/// Draw triangle
/// </summary>
private void DrawTriangle(Graphics g)
{
    g.Clear(Color.White);
    g.FillPolygon(
    Brushes.Orange,
    new PointF[]
    {
        new PointF(0, this.height),
        new PointF(this.width, this.height),
        new PointF(this.width/2, 0)
    });
}
/// <summary>
/// Fill circle
/// </summary>
private void DrawCircle(Graphics g)
{
    g.Clear(Color.White);
    g.FillEllipse(Brushes.Red, 0, 0, this.width, this.height);
}
将图形渲染到位图表面
GDI+ Graphics 对象需要一个绘图表面来渲染图形。 默认的绘图表面是屏幕缓冲区。 但是,在我们的例子中,我们希望将图形渲染到 Bitmap 表面。 下面的 DrawToBitmap() 函数显示了如何将图形绘制到位图表面。 当我们创建 Bitmap 时,我们需要指定表面的 width 和 height。
/// <summary>
/// Draw shape to bitmap
/// </summary>
/// <returns>Bitmap object</returns>
private Bitmap DrawToBitmap()
{
    Bitmap bmp = new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb);
    using (Graphics g = Graphics.FromImage(bmp))
    {
        switch (this.myShape)
        {
            case Shapes.Circle:
                this.DrawCircle(g);
                break;
            case Shapes.Rectangle:
                this.DrawRectangle(g);
                break;
            case Shapes.Triangle:
                this.DrawTriangle(g);
                break;
        }
    }
    return bmp;
}
对 WebRequest 的响应
将图形渲染到 Bitmap 后,我们可以使用 Response.BinaryWrite() 方法响应 Web 请求。 BinaryWrite 的参数是一个字节数组。 为了获得 PNG 图像的响应,我们需要将 Bitmap 转换为字节数组。
以下是如何将 Bitmap 转换为字节数组。
/// <summary>
/// Save bitmap as PNG encoded byte array
/// </summary>
/// <returns>byte arrays</returns>
public byte[] Render()
{
    Rectangle region = new Rectangle(0, 0, this.width, this.height);
    using (Bitmap bitmap = this.DrawToBitmap())
    {
        using (MemoryStream imageStream = new MemoryStream())
        {
            bitmap.Save(imageStream, ImageFormat.Png);
            byte[] buffer = new byte[imageStream.Length];
            imageStream.Seek(0, SeekOrigin.Begin);
            imageStream.Read(buffer, 0, buffer.Length);
            return buffer;
        }
    }
}
最后,您可以使用 Response.BinaryWrite() 函数将 PNG 图像作为响应发送到浏览器。 如果您想使用不同的图像编码,例如 JPEG,您可以在调用 bitmap.Save() 时指定 ImageFormat.Jpeg。
protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "image/png";
    Canvas myCanvas = new Canvas();
    byte[] data;
    if (Request.QueryString.Count != 0)
    {
        string shape = Request.QueryString["shape"];
        if (shape.Equals("triangle", StringComparison.InvariantCultureIgnoreCase))
        {
            myCanvas.MyShape = Canvas.Shapes.Triangle;
        }
        else if (shape.Equals("rectangle", StringComparison.InvariantCultureIgnoreCase))
        {
            myCanvas.MyShape = Canvas.Shapes.Rectangle;
        }
        else
        {
            myCanvas.MyShape = Canvas.Shapes.Circle;
        }
    }
    data = myCanvas.Render();
    Response.BinaryWrite(data);
}
您可以运行给定的示例,如果您将 ASP.NET 项目发布到本地 IIS Web 服务器 (https:///default.aspx),您可以通过在浏览器中运行以下内容来查看 ASP.NET 页面渲染圆形/矩形/三角形
 
 
https:///default.aspx?shape=circle
 
 
https:///default.aspx?shape=rectangle
 
 
https:///default.aspx?shape=triangle
关注点
在本文中,您学习了如何使用 GDI+ 将图形渲染到 Bitmap 表面。 您还学习了如何使用 WebRequest.BinaryWrite() 函数将 PNG 图像作为 WebResponse 发送。
历史
- 2009 年 2 月 17 日:初始帖子


