В настоящее время я работаю с очень большими изображениями, которые в основном создаются путем сшивания множества меньших изображений (например, программного обеспечения для панорамы или фото-мозаики). Чтобы избежать исключений нехватки памяти (в памяти есть только «карты» того, как расположить меньшие изображения), я написал некоторый код, сохраняющий эти изображения построчно в виде растровых изображений, используя 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 пытается сначала полностью загрузить растровое изображение в память, вызывая исключение нехватки памяти.
Я был бы более чем рад любым предложениям о том, как решить или обойти эту проблему!