首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET .ASHX图像生成。NotSupportedException

ASP.NET .ASHX图像生成。NotSupportedException
EN

Stack Overflow用户
提问于 2013-07-12 16:45:42
回答 1查看 294关注 0票数 0

我正在使用以下代码在我的ASP.NET web应用程序中动态绘制图像。

代码语言:javascript
复制
Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim js As New JavaScriptSerializer
    Dim ai As absencestruct = js.Deserialize(Of absencestruct)(CStr(context.Request.QueryString.Item("json")))

    'Ensure font is readable (half height of block or 12px whichever is smaller)
    Dim f As Font = New Font("Calibri", Math.Min(CInt(CDbl(ai.size.height) / 2.5), 12), GraphicsUnit.Pixel)

    Dim img As New Bitmap(CInt(ai.size.width), CInt(ai.size.height))
    Dim g As Graphics = Graphics.FromImage(img)

    g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality

    If ai.textStyle <> textStyleEnum.invisible Then
        g.Clear(Color.White)
    End If

    Dim r As New Rectangle(1, 1, CInt(ai.size.width) - 1, CInt(ai.size.height) - 1)

    r = New Rectangle(r.Left + 2, r.Top + 2, r.Width - 4, r.Height - 4)

    drawAbsence(ai, True, r, g)
    If ai.abs2.type <> AbsenceItem.halfDays.Errored AndAlso ai.drawStyle = AbsenceItem.drawStyle.orphan Then
        drawAbsence(ai, False, r, g)
    End If

    Dim s As SizeF = g.MeasureString(ai.day.ToString, f)
    Dim br As SolidBrush = CType(Brushes.Black, SolidBrush)
    If ai.textStyle = textStyleEnum.otherMonth Then br = CType(Brushes.Gray, SolidBrush)

    If ai.textStyle <> textStyleEnum.invisible Then
        g.DrawString(ai.day.ToString, f, br, New Point(CInt((CDbl(ai.size.width) / 2) - CInt(s.Width / 2)), CInt((CDbl(ai.size.height) / 2) - CInt(s.Height / 2))))
    End If

    context.Response.ContentType = "image/png"
    img.Save(context.Response.OutputStream, ImageFormat.Png)
    img.Dispose()
End Sub

以前,它工作得非常好,但是,当它到达

代码语言:javascript
复制
img.dispose

我得到一个异常NotSupportedException“指定的方法不受支持”

我删除了dispose调用,看看会发生什么……在这一点上,我得到了完全相同的错误

代码语言:javascript
复制
End Sub

因为我认为这几乎是不可能的,所以我尝试了重启PC和Visual Studio 2012。没有效果。

应该注意的是,如果我跳过错误的图像工作得很好,然而,我相信你可以欣赏当页面绘制任何这些图像多达50跳过它们可能是相当耗时的,最重要的是,如果有任何机会,图像将由于此而失败,我相信我的客户将不会有太大的印象。

EN

回答 1

Stack Overflow用户

发布于 2013-07-13 03:23:57

以下是一些建议:

您应该将img和图形的使用包装在Using块中,而不是调用显式dispose。

您应该刷新并关闭响应流,以确保在释放图像之前完成图像的使用。

代码语言:javascript
复制
Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements IHttpHandler.ProcessRequest
    Dim js As New JavaScriptSerializer
    Dim ai As absencestruct = js.Deserialize(Of absencestruct)(CStr(context.Request.QueryString.Item("json")))

    'Ensure font is readable (half height of block or 12px whichever is smaller)
    Dim f As Font = New Font("Calibri", Math.Min(CInt(CDbl(ai.size.height) / 2.5), 12), GraphicsUnit.Pixel)

    Using img As New Bitmap(CInt(ai.size.width), CInt(ai.size.height))
        Using g As Graphics = Graphics.FromImage(img)

            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality

            If ai.textStyle <> textStyleEnum.invisible Then
                g.Clear(Color.White)
            End If

            Dim r As New Rectangle(1, 1, CInt(ai.size.width) - 1, CInt(ai.size.height) - 1)

            r = New Rectangle(r.Left + 2, r.Top + 2, r.Width - 4, r.Height - 4)

            drawAbsence(ai, True, r, g)
            If ai.abs2.type <> AbsenceItem.halfDays.Errored AndAlso ai.drawStyle = AbsenceItem.drawStyle.orphan Then
                drawAbsence(ai, False, r, g)
            End If

            Dim s As SizeF = g.MeasureString(ai.day.ToString, f)
            Dim br As SolidBrush = CType(Brushes.Black, SolidBrush)
            If ai.textStyle = textStyleEnum.otherMonth Then br = CType(Brushes.Gray, SolidBrush)

            If ai.textStyle <> textStyleEnum.invisible Then
                g.DrawString(ai.day.ToString, f, br, New Point(CInt((CDbl(ai.size.width) / 2) - CInt(s.Width / 2)), CInt((CDbl(ai.size.height) / 2) - CInt(s.Height / 2))))
            End If

            context.Response.ContentType = "image/png"
            img.Save(context.Response.OutputStream, ImageFormat.Png)
            context.Response.Flush()
            context.Response.Close()
        End Using
    End Using
End Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17610932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档