Warum erhalte ich diese generisch, nicht näher bezeichneten Fehler in GDI + beim Versuch, eine PNG zu retten?

StackOverflow https://stackoverflow.com/questions/511579

  •  21-08-2019
  •  | 
  •  

Frage

Ich habe eine Funktion, die dynamisch Text zu einem Bild in einer vorbezeichneten Stelle hinzuzufügt. Ursprünglich habe ich es mit JPEG-Dateien, und es funktioniert. Ich wechselte zu PNG so würden die Bilder eine bessere Qualität, da die Original-JPEG-Dateien pixely Art waren. Wie auch immer, hier ist mein Code. Sie führt auf die oBitmap.Save() nach unten, dann stirbt mit „A Allgemein Fehler in GDI + aufgetreten“.

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    context.Response.ContentType = "image/png"
    context.Response.Clear()
    context.Response.BufferOutput = True

    Try
        Dim oText As String = context.Server.HtmlDecode(context.Request.QueryString("t"))
        If String.IsNullOrEmpty(oText) Then oText = "Placeholder"
        Dim oPType As String = context.Server.HtmlDecode(context.Request.QueryString("p"))
        If String.IsNullOrEmpty(oPType) Then oPType = "none"

        Dim imgPath As String = ""
        Select Case oPType
            Case "c"
                imgPath = "img/banner_green.png"
            Case "m"
                imgPath = "img/banner_blue.png"
            Case Else
                Throw New Exception("no ptype")
        End Select

        Dim oBitmap As Bitmap = New Bitmap(context.Server.MapPath(imgPath))
        Dim oGraphic As Graphics = Graphics.FromImage(oBitmap)
        Dim frontColorBrush As New SolidBrush(Color.White)
        Dim oFont As New Font(FONT_NAME, 30)


        Dim oInfo() As ImageCodecInfo = ImageCodecInfo.GetImageEncoders
        Dim oEncoderParams As New EncoderParameters(2)
        Dim xOffset As Single = Math.Round((oBitmap.Height - oFont.Height) / 2, MidpointRounding.ToEven)
        Dim oPoint As New PointF(275.0F, xOffset + 10)

        oEncoderParams.Param(0) = New EncoderParameter(Encoder.Quality, 100L)
        oEncoderParams.Param(1) = New EncoderParameter(Encoder.ColorDepth,8L)

        oGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
        oGraphic.DrawString(oText, oFont, frontColorBrush, oPoint)
        oBitmap.Save(context.Response.OutputStream, oInfo(4), oEncoderParams)
        context.Response.Output.Write(oBitmap)

        oFont.Dispose()
        oGraphic.Dispose()
        oBitmap.Dispose()  
        context.Response.Flush()
    Catch ex As Exception

    End Try
End Sub

Die einzigen Änderungen, die ich auf diesem von der JPEG-Version gemacht sind:

  • context.Response.ContentType = "image/jpeg" geändert "image/png"
  • geändert Basisbilder (img/banner_green.jpg, img/banner_blue.jpg) .png
  • hinzugefügt, um den zweiten Codierungsparameter spezifizieren Farbtiefe
  • geändert oInfo(1) (jpeg) oInfo(4) (png)

Gibt es Dinge, die ich brauche zu zwicken diese Routine zu bekommen, um richtig die PNG zu erzeugen?

War es hilfreich?

Lösung

Nach diesem Beitrag erfordert Bitmap.Save einen seekable Strom als PNG zu speichern, die HttpResponse.OutputStream nicht. Sie werden zuerst das Bild in einen Memorystream speichern müssen, und kopieren Sie dann den Inhalt davon Response.OutputStream, wie:

Dim tempStream as New MemoryStream
oBitmap.Save(tempStream, ImageFormat.Png, oEncoderParams)
Response.OutputStream.Write(tempStream.ToArray(), 0, tempStream.Length)

Beachten Sie auch, dass die Zeile

context.Response.Output.Write(oBitmap)

tut etwas anderes dann, was Sie wahrscheinlich erwarten. HttpResponse.Output ist ein Textwriter, und die Überlastung Sie hier verwenden, TextWriter.Write(object) ruft nur ToString auf dem Objekt und schreibt die Ergebnisse in den Strom, was in diesem Fall Ergebnisse schriftlich „System.Drawing.Bitmap“ zum Ausgang.

Andere Tipps

Sie Entsorgen der Bitmap, bevor Sie die Antwort sind Spülung? Versuchen Sie, dass rund Spiegeln. Auch sieht es so aus, wie Sie die Bitmap in den Stream zweimal gerade schreiben. Ich bin mir nicht sicher, warum Sie das tun. Speichern Sie die Bitmap in den Ausgabestream oder verwenden Sie die Write-Methode des Response-Objekts, aber nicht beide.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top