В настоящее время я обрабатываю очень большие изображения, которые в основном создаются путем сшивания множества меньших изображений (например, программа для создания панорамы или фотомозаики). из-за исключений памяти (в памяти находятся только «карты» расположения меньших изображений), я написал некоторый код, сохраняющий эти изображения построчно в виде растровых изображений, используя BinaryWriter и LockBits. Пока все хорошо.
Проблема в том, что Теперь, когда я хотел бы сохранить эти изображения как Jpeg (или PNG). Поскольку я новичок в C #, я могу думать только о двух способах:
1) Подобно процедуре сохранения растрового изображения. Создание некоторого заголовка jpeg и сохранение больших изображений построчно, сжимая их как-то раньше. Я понятия не имею, как выполнять сжатие.
2) Потоковая передача уже сохраненного растрового изображения в память и сохранение его в виде закодированного jpeg.
Поскольку второй подход казался более простым, я попробовал что-то вроде этого:
FileStream fsr =
new FileStream("input.bmp", FileMode.Open, FileAccess.Read);
FileStream fsw =
new FileStream("output.jpg", FileMode.CreateNew, FileAccess.Write);
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] =
new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
Bitmap bmp = new Bitmap(fsr);
bmp.Save(fsw, GetEncoder(ImageFormat.Jpeg), encoderParameters);
bmp.Dispose();
Проблема в том, что метод save сначала пытается полностью загрузить растровое изображение в память, вызывая исключение нехватки памяти.
Я был бы более чем рад любым предложениям, как решить или обойти эту проблему!