GDI + общая ошибка - PullRequest
       1

GDI + общая ошибка

3 голосов
/ 28 ноября 2011

Когда мои изображения загружаются из моей базы данных на моем веб-сервере, я вижу следующую ошибку:

В GDI + произошла общая ошибка.в System.Drawing.Image.Save (поток Stream, кодер ImageCodecInfo, EncoderParameters encoderParams) в System.Drawing.Image.Save (поток Stream, формат ImageFormat) в MyWeb.Helpers.ImageHandler.ProcessRequest (контекст HttpContext)

Все, что мой код пытается сделать, это загрузить изображение, кто-нибудь может взглянуть и сообщить мне, что я делаю неправильно?

Примечание. Это сработает, если я протестирую его на своем локальном компьютере., но не при развертывании на моем веб-сервере.

public void ProcessRequest(HttpContext context)
{
    context.Response.Clear();          

    if (!String.IsNullOrEmpty(context.Request.QueryString["imageid"]))         
    {
        int imageID = Convert.ToInt32(context.Request.QueryString["imageid"]);
        int isThumbnail = Convert.ToInt32(context.Request.QueryString["thumbnail"]);

        // Retrieve this image from the database
        Image image = GetImage(imageID);

        // Make it a thumbmail if requested
        if (isThumbnail == 1)
        {
            Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
            image = image.GetThumbnailImage(200, 200, myCallback, IntPtr.Zero);
        }

        context.Response.ContentType = "image/png";             

        // Save the image to the OutputStream             
        image.Save(context.Response.OutputStream, ImageFormat.Png);
    }         
    else         
    {             
        context.Response.ContentType = "text/html";             
        context.Response.Write("<p>Error: Image ID is not valid - image may have been deleted from the database.</p>");         
    } 
}

Ошибка возникает в строке:

image.Save (context.Response.OutputStream, ImageFormat.Png);

ОБНОВЛЕНИЕ

Я изменил свой код на это, но проблема все еще возникает:

var db = new MyWebEntities();

var screenshotData = (from screenshots in db.screenshots
                      where screenshots.id == imageID
                      select new ImageModel
                      {
                           ID = screenshots.id,
                           Language = screenshots.language,
                           ScreenshotByte = screenshots.screen_shot,
                           ProjectID = screenshots.projects_ID
                      });

foreach (ImageModel info in screenshotData) 
 {
    using (MemoryStream ms = new MemoryStream(info.ScreenshotByte))
    {
         Image image = Image.FromStream(ms);

         // Make it a thumbmail if requested
         if (isThumbnail == 1)
         {
              Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
              image = image.GetThumbnailImage(200, 200, myCallback, IntPtr.Zero);
         }

         context.Response.ContentType = "image/png";

         // Save the image to the OutputStream             
         image.Save(context.Response.OutputStream, ImageFormat.Png);

    } }

Спасибо.

1 Ответ

2 голосов
/ 28 ноября 2011

Вероятно, по той же причине, по которой у этого парня возникли проблемы - поскольку в течение жизни образа, созданного из Stream, поток не должен быть уничтожен.

Таким образом, если ваша функция GetImage создает возвращенное изображение из потока (например, MemoryStream), а затем закрывает поток перед возвратом изображения, то вышеприведенное не будет выполнено. Я думаю, что ваш GetImage выглядит так:

Image GetImage(int id)
{
    byte[] data = // Get data from database
    using (MemoryStream stream = new MemoryStream(data))
    {
        return Image.FromStream(data);
    }
}

Если это так, попробуйте GetImage вернуть MemoryStream (или, возможно, байтовый массив) напрямую, чтобы вы могли создать Image экземпляр в вашем методе ProcessRequest и утилизировать поток только тогда, когда обработка этого изображения завершена.

Это упомянуто в документации , но оно напечатано мелким шрифтом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...