Грешка: Няма памет при преобразуване на .jls изображение в масив byte[].

Имам тази функция, която преобразува изображение в байтов масив.

  public byte[] imageToByteArray(System.Drawing.Image imageIn)
    {
        MemoryStream ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.MemoryBmp);
        return ms.ToArray();
    }

Това е моят код за извикване на функцията.

  private void btn_Click(object sender, EventArgs e)
    {
       inputPath=textbox1.text;

        try
        {
            System.Drawing.Image img = Image.FromFile(inputPath);
           byte[] str= imageToByteArray(img);
         }


     catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

Когато стартирам програмата или когато събитието се задейства, тя хвърля изключение, което казва „Няма памет“ - Защо се случва това?

Използвам тази функция за декодиране на .jls изображения (изображения, компресирани с помощта на алгоритъма JPEG-LS). Така че това ясно означава, че файлът не се поддържа, нали? Знаете ли други алтернативи?


person user919789    schedule 17.10.2012    source източник


Отговори (3)


От MSDN:

Ако файлът няма валиден формат на изображение или ако GDI+ не поддържа пикселния формат на файла, този метод хвърля изключение OutOfMemoryException.

Освен това:

Класът Image не поддържа алфа прозрачност в растерни изображения. За да активирате алфа прозрачност, използвайте PNG изображения с 32 бита на пиксел.

Повече информация за поддържаните формати можете да намерите тук.

person Sani Singh Huttunen    schedule 17.10.2012
comment
+1 за коментара, но не звучи ли странно? С това имам предвид докладване на OOM изключение, когато това не е действителната причина. Бих си помислил, че нещо като InvalidOperationException или нещо подобно би било по-подходящо. - person Mr Moose; 17.10.2012
comment
Използвам тази функция за декодиране на .jls изображения (изображения, компресирани с помощта на алгоритъма JPEG-LS). Така че това ясно означава, че файлът не се поддържа, нали? Знаете ли други алтернативи? - person user919789; 17.10.2012
comment
@MrMoose: Тъй като това е GDI+ обвивка, изключението идва от GDI+. Или по-скоро кода на грешката. GDI+ има само около 22 кода за грешка IIRC и кодът за грешка на OOM може да означава много неща. Понякога означава OOM, понякога означава нещо друго. - person Sani Singh Huttunen; 17.10.2012
comment
странно. Благодаря все пак за пояснението. - person Mr Moose; 17.10.2012
comment
@Sani Huttunun : Да, опитвам се да внедря CharLS в C#, очевидно те не предоставят примери за декомпресия. - person user919789; 17.10.2012

опитайте това за Image to byte[]:

 byte[] str = File.ReadAllBytes("InputImagePath");

private void btn_Click(object sender, EventArgs e)  
    {  
       inputPath=textbox1.text;  

        try  
        {  
          byte[] str= File.ReadAllBytes("inputPath");
        }  


     catch (Exception ex)  
        {  
            MessageBox.Show(ex.Message);  
        }  
    }  
person Community    schedule 17.10.2012

Изключението за липса на памет е много обяснимо.

Можете да опитате следното

  • Опитайте с различен размер на изображението и наблюдавайте кой диапазон на размери системата започва да получава изключение от паметта
  • Опитайте да изхвърлите своя MemoryStream

Пример

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    using(MemoryStream ms = new MemoryStream()) 
    {
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.MemoryBmp);
        return ms.ToArray();
    }
}
person Neverever    schedule 17.10.2012