Pregunta

Si intenta usar 300dpi imágenes tif para su visualización en la web. Por el momento, cuando el usuario sube una imagen, estoy creando dinámicamente una imagen en miniatura. Si se crea una página hace referencia a la imagen de alta resolución con un ancho de 500x500px, puedo usar la misma funcionalidad para convertir a un gif / jpg sobre la marcha. ¿Cuál es la resolución inminente del jpg que se crearía?

EDIT:

Para explicar aún más el uso, el usuario carga 300dpi imágenes que son aprox 3000x3000 píxeles. El usuario utiliza estas imágenes para crear una página de catálogo que será utilizado para la impresión de PDF. Cuando están creando la página, sólo tenemos imágenes 72dpi para mostrar a la pantalla, pero para la impresión, necesitamos las imágenes 300dpi. Obviamente ellos no quieren añadir una imagen de 3000x3000px a la página, por lo que debe ser redimensionado a la zona correcta visualización, por ejemplo, 500x500px etc.

¿Fue útil?

Solución

Esto se reduce a un simple cambio de tamaño de imagen. La discusión de inhaladores de polvo seco es sólo datos auxiliares para calcular el factor de escala.

Como dijo @Guffa, usted debe hacer esto en el momento de la carga de modo que sólo puede servir las imágenes estáticas en el visor.

Esta será una carga en el servidor:

  1. Cargar la imagen completa. Esto será de unos 27 MB de memoria para sus 3000x3000 imágenes.
  2. Cambiar tamaño. La porción de matemáticas hecho con pereza (siendo la CPU).
  3. Comprimir. Más CPU + Costo de la escritura a la unidad.

Dado que ya está tomando el tiempo para generar una imagen en miniatura, puede amortizar que el costo y este costo al no tener que repetir el paso 1 anterior (ver el Código).

Después de una imagen se uplaoded, yo recomendaría la escisión de un hilo para hacer este trabajo. Es una carga en el servidor web seguro, pero usted es única otra opción es dedicar una segunda máquina para realizar el trabajo. Se tendrá que hacer con el tiempo.

Aquí hay un código para hacer el trabajo. Las líneas importantes son los siguientes:

OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));

Podemos cambiar el tamaño de la imagen big sin embargo necesitamos. En la primera línea simplemente que reduce la escala por una escala fija (72,0 / 300,0). En la segunda línea, que fuerce la imagen para tener una dimensión max final del 64 (factor de escala = 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"));

Otros consejos

Si entiendo lo que quiere - que está tratando de hacer un gif o jpg en miniatura de una resolución muy alta tif, para su visualización Web - si no, me disculpo de antemano ....


Si desea que la imagen en miniatura para ser 500x500px, que es la resolución del jpg / gif usted quiere crear - 500x500, o al menos 500x <500 o <500x500 (para caber en la caja, a menos que desee distorsionada imágenes).

Para la visualización en la web, el DPI no importa. Sólo tiene que utilizar la resolución de píxeles que desea directamente.

Técnicamente, el JPG / GIF se crea en 72 DPI por las clases de la imagen en .NET. Pero el DPI realmente no tiene ningún significado para el navegador -. Que sólo utiliza las dimensiones 500x500

Cuando se muestra una imagen en una web, los puntos por pulgada (ppp o más correctamente) entorno es irrelevante. Es sólo el tamaño en píxeles que es relevante.

Puede convertir una imagen sobre la marcha, pero es muy intenso trabajo para el servidor para hacer que cada vez que se muestra la imagen. Debe crear los tamaños que usted necesita cuando el usuario carga la imagen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top