Как передавать изображения с высоким разрешением в форму с низким разрешением с помощью C#

StackOverflow https://stackoverflow.com/questions/754168

Вопрос

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

РЕДАКТИРОВАТЬ:

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

Это было полезно?

Решение

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

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

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

  1. Загрузите полное изображение.Это будет около 27 МБ памяти для ваших изображений размером 3000х3000.
  2. Изменить размер.Много математических вычислений выполняется лениво (все еще нагружает процессор).
  3. Компресс.Больше процессора + стоимость записи на ваш диск.

Поскольку вы уже тратите время на создание миниатюры, вы можете амортизировать эту стоимость и эту стоимость, не повторяя шаг 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"));

Другие советы

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


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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top