2015-10-10 5 views
1

У меня есть следующий код:Общий GDI + ошибка возникает при сохранении изображения

static void Main(string[] args) 
{ 
    const int SAMPLE_SIZE = 256 * 256; 
    float[] samples = new float[SAMPLE_SIZE]; 
    using (Bitmap bmp = new Bitmap(SAMPLE_SIZE, 1)) 
    { 
     for (int i = 0; i < samples.Length; ++i) 
     { 
      int c = (int)(samples[i] * 127 + 128); 
      bmp.SetPixel(i, 0, Color.FromArgb(c, c, c)); 
     } 
     bmp.Save("result.png"); //A generic error occurred in GDI+. 
    } 
} 

В аварии программы при сохранении растрового изображения. Когда я устанавливаю SAMPLE_SIZE на меньшее значение, никаких исключений не выбрасывается. Такая же ошибка возникает на x64 и x86.

Я попытался сохранить промежуточный поток, но та же ошибка возникает.

using (MemoryStream stream = new MemoryStream()) 
{ 
    bmp.Save(stream, ImageFormat.Png); 
    stream.WriteTo(fs); 
} 

Почему это происходит? Ошибка возникает на x64. Может ли это быть проблемой памяти? Размеры изображения составляют 65536x1, что не так уж велико в плане зарезервированных байтов.

+0

посмотрите здесь https://code.google.com/p/pngcs/, чтобы вам не нужно хранить большие файлы изображений в памяти – MethodMan

+0

Спасибо. Я знаю об этом. Однако мне интересно, почему это происходит. –

+0

Попробуйте «новый битмап» (bmp) .Save («result.png»); ' – cubrr

ответ

1

У меня нет ссылки, но мой опыт заключался в том, что графика на основе GDI, и особенно обработка растровых изображений, полностью поддерживается только в 16-разрядной системе координат. То есть координаты чертежа ограничены между -32768 и 32767, а максимальная ширина (или высота) растрового изображения будет равна 65535 (так как размеры не могут быть отрицательными). Последнее соответствует максимальным значениям JPEG.

PNG теоретически может обрабатывать гораздо большие (32-разрядные размеры), но было бы неудивительно, если между двумя кодировщиками есть определенный компонент, который предполагает ограничение JPEG. Извините, я не могу выкопать ссылку на данный момент, но я ожидаю, что это будет, если вы посмотрите достаточно серьезно.