2015-11-08 7 views
0

Im создание программного обеспечения для Symbol MC75A с использованием C# .net CF 2.0. Мы сканируем штрих-код, и он возвращает информацию о запасах, но я пытаюсь добавить функцию, которая получает изображение с URL-адреса. Каждое сканирование обновляет экран новыми данными из базы данных, а также получает изображение с нового URL-адреса. Он сканирует несколько штрих-кодов и возвращает, возможно, 4/5 изображений без проблем, и внезапно возникает OutOfMemoryException. Код им с помощью, чтобы получить изображение является:.net Compact Framework 2.0 - Исключение OutOfMemory При загрузке изображения

 public Bitmap GetImage(string URL) 
    { 
     HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL); 
     myRequest.Method = "GET"; 

     myRequest.AllowWriteStreamBuffering = false; 



     HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); 

     System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream()); 
      myResponse.Close(); 


      return bmp; 

    } 

Вызывается:

     pbImage.Image = GetImage(ProductImage); 
        pbImage.SizeMode = PictureBoxSizeMode.StretchImage; 

Я пытался избавиться от образа перед каждым новым GET с pbImage.Image.Dispose(), но по-прежнему получать тот же исключение. Размеры изображения составляют от 100 КБ до 550 КБ. Независимо от того, имеет ли значение размер изображений, они всегда превышают 1000 пикселей на каждой стороне.

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

+0

изображения поступают во временные файлы IE. Вы можете удалить историю просмотров. Когда-нибудь использование сниффера, такого как скрипач или wirehark, может помочь изолировать проблемы при загрузке. – jdweng

+0

Разве это всегда ломается на одном изображении? System.Drawing славится броском OutOfMem по многим другим причинам. Это можно обработать с помощью try/catch. –

+0

Ваш 'myRespones.Close()' должен находиться в конце или в блоке использования. Вы уверены, что нет других исключений? –

ответ

0

Просто у кого-то есть доступ к расположению изображения. Лучшая работа для меня заключалась в создании веб-страницы с именем resize.aspx и заполнении окна изображения со страницы с именем файла изображения в качестве параметра. Теперь эта страница (находящаяся на сервере в том же месте, что и изображения) смогла изменить размер изображения и вернуть небольшое изображение размером 300x300 пикселей. Казалось, это лучшее решение, о котором я мог думать. Это также может работать для изображений на любом URL-адресе, если вы передаете полный URL-адрес изображения на другую страницу, и эта страница вернет требуемый миниатюру.

2

Я нашел свое решение Herer:

OutOfMemoryException loading big image to Bitmap object with the Compact Framework

Кажется, это System.Drawing при распаковке 2000px изображений он создает несжатый образ, дающий больший размер на Hense памяти исключения. Решение показывает способ получения миниатюры изображения, а не всего изображения.

Спасибо за вашу помощь еще раз.