Как обслуживать изображения высокого разрешения в форме низкого разрешения с использованием C # - PullRequest
4 голосов
/ 16 апреля 2009

Попытка использовать изображения с разрешением 300 точек на дюйм для отображения в Интернете. В тот момент, когда пользователь загружает изображение, я динамически создаю эскиз. Если страница создана со ссылкой на изображение в высоком разрешении шириной 500x500 пикселей, могу ли я использовать ту же функциональность для преобразования в gif / jpg на лету. Каково предстоящее разрешение jpg, которое будет создано?

EDIT:

Чтобы более подробно объяснить использование, пользователь загружает изображения с разрешением 300 точек на дюйм, которые имеют размер около 3000x3000 пикселей. Пользователь использует эти изображения для создания страницы каталога, которая будет использоваться для печати PDF. Когда они создают страницу, нам нужны только изображения с разрешением 72 точек на дюйм для отображения на экране, но для печати нужны изображения с разрешением 300 точек на дюйм. Очевидно, что они не хотят добавлять изображение 3000x3000 пикселей на страницу, поэтому его необходимо изменить в соответствии с правильной областью просмотра, например, 500x500px и т. Д.

Ответы [ 4 ]

6 голосов
/ 16 апреля 2009

Это сводится к простому изменению размера изображения. Обсуждение DPI - это просто вспомогательные данные для расчета масштабного коэффициента.

Как сказал @Guffa, вы должны сделать это во время загрузки, чтобы вы могли просто показывать статические изображения в вашей программе просмотра.

Это будет нагрузка на сервер:

  1. Загрузить полное изображение. Это будет около 27 МБ памяти для ваших изображений 3000x3000.
  2. Изменение размера. Много математики выполняется лениво (по-прежнему интенсивно использует процессор).
  3. Сжать. Больше 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"));
0 голосов
/ 16 апреля 2009

Технически JPG / GIF создается при 72-DPI классами изображений в .NET. Но DPI на самом деле не имеет никакого значения для браузера - он просто использует размеры 500x500.

0 голосов
/ 16 апреля 2009

При отображении изображения в сети настройка dpi (или, точнее, ppi) не имеет значения. Уместен только размер в пикселях.

Вы можете конвертировать изображение на лету, но для сервера требуется очень много времени, чтобы делать это каждый раз, когда изображение отображается. Вы должны создать размеры, которые вам нужны, когда пользователь загружает изображение.

0 голосов
/ 16 апреля 2009

Если я понимаю, что вы хотите - вы пытаетесь сделать изображение в формате gif или jpg с очень высоким разрешением tif для отображения в Интернете - если нет, я заранее извиняюсь ....


Если вы хотите, чтобы миниатюра была 500x500px, то это разрешение jpg / gif, которое вы хотите создать - 500x500, или, по крайней мере, 500x <500 или <500x500 (чтобы поместиться в поле, если вы не хотите искажать изображения). </p>

Для отображения в Интернете DPI не имеет значения. Просто используйте желаемое разрешение в пикселях.

...