4

クエリ文字列にあるものを縦書きテキストとしてレンダリングし、PNG を返す ASPX ページがあります。それはうまくいきます。

問題に遭遇した顧客が 1 人だけいます。数日おきに、ページが機能しなくなり、恐ろしい GDI+ の「一般的な」エラーがスローされます。

Error: System.Runtime.InteropServices.ExternalException (0x80004005): A generic error occurred in GDI+.
at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(Stream stream, ImageFormat format)
...

エラーが発生する理由、または最終的に消える理由がわかりません。問題を特定できるかどうかを確認するために、いくつかのバリエーションを含む同様のコードを実行するテスト ASPX ファイルをインストールに投入することができました。ImageFormat を Png から Jpeg に変更すると、エラーが解消されることがわかりました。

PNG の代わりに JPEG をレンダリングするように製品を変更することも考えられます。ただし、これが最終的に現在のように断続的にエラーを引き起こし始めるかどうかを知る方法はありません。

このような問題を引き起こす原因を知っている人はいますか? ありがとう!コードは以下です。

更新: お客様のサーバーは、IIS 7.5 を実行する Windows Server 2008 R2 ボックスであり、私のアプリケーションは .NET 4.0 で実行されます。

    protected void Page_Load(object sender, EventArgs e)
    {
        byte[] image = GetImageBytes(this.Text);
        if (image != null)
        {
            Response.ClearContent();
            Response.ClearHeaders();
            Response.ContentType = "image/png";
            Response.OutputStream.Write(image, 0, image.Length);
        }
    }

    private byte[] GetImageBytes(string text)
    {
        var font = new Font("Tahoma", 11, FontStyle.Bold, GraphicsUnit.Pixel);

        // Create an image the size of the text we are writing
        Bitmap img = new Bitmap(1,1);
        var graphics = Graphics.FromImage(img);
        int width = (int)graphics.MeasureString(text, font).Width;
        int height = (int)graphics.MeasureString(text, font).Height;
        img = new Bitmap(img, new Size(width, height));

        // Draw the text onto the image
        graphics = Graphics.FromImage(img);
        graphics.Clear(Color.Transparent);
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        graphics.DrawString(text, font, new SolidBrush(Color.Black), 0, 0);
        graphics.Flush();

        // Rotate the image to be vertical
        img.RotateFlip(RotateFlipType.Rotate270FlipNone);

        var stream = new System.IO.MemoryStream();
        img.Save(stream, ImageFormat.Png);
        stream.Position = 0;
        return stream.ToArray();
    }
4

1 に答える 1

3

フラッシュが問題になる可能性があると思います

保留中のすべてのグラフィックス操作を強制的に実行し、操作が完了するのを待たずにすぐに戻ります。

このメンバーはオーバーロードされています。構文、使用法、例など、このメンバーの詳細については、オーバーロード リストの名前をクリックしてください。

これを試して、まだ問題があるかどうかを確認できますか?

    private byte[] GetImageBytes(string text)
    {
        using (var font = new Font("Tahoma", 20, FontStyle.Bold, GraphicsUnit.Pixel))
        using (var img = new Bitmap(1, 1))
        {
            int width;
            int height;
            using (var graphics = Graphics.FromImage(img))
            {
                width = (int)graphics.MeasureString(text, font).Width;
                height = (int)graphics.MeasureString(text, font).Height;
            }
            using (var realImg = new Bitmap(img, new Size(width, height)))
            {
                using (var graphics = Graphics.FromImage(realImg))
                {
                    graphics.Clear(Color.Transparent);
                    graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                    graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
                    graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                    graphics.DrawString(text, font, new SolidBrush(Color.Black), 0, 0);
                }

                realImg.RotateFlip(RotateFlipType.Rotate270FlipNone);

                using (var stream = new System.IO.MemoryStream())
                {
                    realImg.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                    stream.Position = 0;
                    return stream.ToArray();
                }
            }
        }
    }
于 2013-07-11T18:24:24.573 に答える