Полагаю, вы делаете что-то вроде этого:
Bitmap bitmap = new Bitmap (filename of jpeg);
и затем делает:
OnPaint (...)
{
Graphics g = ....;
g.DrawImage (bitmap, ...);
}
Это будет изменять размер огромного изображения JPEG до размера, отображаемого на экране каждый раз, когда вы его рисуете. Я предполагаю, что ваш JPEG имеет размер около 2500x2000 пикселей. Когда вы загружаете JPEG в растровое изображение, код загрузки растрового изображения распаковывает данные и сохраняет их либо как данные RGB в формате, который будет легко отображать (т. Е. В том же формате пикселей, что и дисплей), либо как элемент, известный как Независимое от устройства растровое изображение (также известное как DIBitmap). Этим растровым изображениям требуется больше оперативной памяти для хранения, чем сжатому JPEG.
Ваша текущая реализация уже выполняет преобразование формата и изменение его размера, но делает это неэффективным способом, то есть изменяет размер огромного изображения до размера экрана каждый раз, когда оно отображается.
В идеале вы хотите загрузить изображение и уменьшить его. .Net имеет систему для этого:
Bitmap bitmap = new Bitmap (filename of JPEG);
Bitmap thumbnail = bitmap.GetThumbnailImage (width, height, ....);
bitmap.Dispose (); // this releases all the unmanged resources and makes the bitmap unusable - you may have been missing this step
bitmap = null; // let the GC know the object is no longer needed
где ширина и высота - размер требуемой миниатюры. Теперь это может привести к тому, что изображения будут выглядеть не так хорошо, как хотелось бы (но будут использоваться любые встроенные данные миниатюр, если они есть, поэтому они будут работать быстрее), в этом случае выполните изменение размера растрового изображения -> растрового изображения .
Когда вы создаете файл PDF, вам необходимо перезагрузить данные JPEG, но с точки зрения пользователя, все в порядке. Я уверен, что пользователь не будет возражать подождать некоторое время, чтобы экспортировать данные в PDF, если у вас есть какие-то отзывы, чтобы сообщить пользователю, что они обрабатываются. Вы также можете сделать это в фоновом потоке и позволить пользователю работать с другим коллажем.