Это сводится к простому изменению размера изображения. Обсуждение DPI - это просто вспомогательные данные для расчета масштабного коэффициента.
Как сказал @Guffa, вы должны сделать это во время загрузки, чтобы вы могли просто показывать статические изображения в вашей программе просмотра.
Это будет нагрузка на сервер:
- Загрузить полное изображение. Это будет около 27 МБ памяти для ваших изображений 3000x3000.
- Изменение размера. Много математики выполняется лениво (по-прежнему интенсивно использует процессор).
- Сжать. Больше CPU + Стоимость записи на ваш диск.
Поскольку вы уже тратите время на создание миниатюры, вы можете амортизировать эту стоимость и эту стоимость, не повторяя шаг 1 выше (см. Код).
После загрузки изображения я бы порекомендовал раскрутить нить, чтобы выполнить эту работу. Конечно, это нагрузка на веб-сервер, но у вас есть только другой вариант - посвятить второй компьютер выполнению работы. Это должно быть сделано в конце концов.
Вот код для выполнения этой работы. Важные строки таковы:
OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));
Мы можем изменить размер big
изображения так, как нам нужно. В первой строке мы просто уменьшаем его до фиксированной (72.0 / 300.0). Во второй строке мы заставляем изображение иметь окончательный максимальный размер 64 (коэффициент масштабирования = 64.0 / 3000.0).
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;
BitmapSource Resize(BitmapSource original,
double originalScale,
double newScale) {
double s = newScale / originalScale;
return new TransformedBitmap(original, new ScaleTransform(s, s));
}
void OutputAsJpeg(BitmapSource src, Stream out) {
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(src));
encoder.Save(out);
}
// Load up your bitmap from the file system or whatever,
// then dump it out to a smaller version and a thumbnail.
// Assumes thumbnails have a max dimension of 64
BitmapSource big = new BitmapImage(new Uri("BigPage0.png",
UriKind. RelativeOrAbsolute));
double bigSize = Math.Max(big.PixelWidth, big.PixelHeight);
OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));