C # сохраняет очень большие растровые изображения в формате jpeg (или в любом другом сжатом формате)

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

Я был бы более чем рад любым предложениям, как решить или обойти эту проблему!

9
задан Yuck 23 November 2011 в 19:51
поделиться