Ошибка: Недостаточно памяти при преобразовании изображения .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

попробуйте это для изображения в байт []:

 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