Pergunta

Tentando usar 300dpi tif imagens para exibição na web. No momento, quando o usuário carrega uma imagem, eu estou criando dinamicamente uma miniatura. Se uma página é criada referenciando o de imagem de alta resolução com uma largura de 500x500px, posso usar a mesma funcionalidade para converter em um gif / jpg na mosca. Qual é a resolução iminente do jpg que seria criado?

EDIT:

Para explicar melhor o uso, o usuário envios 300dpi imagens que são cerca de 3000x3000 pixels. O usuário está usando essas imagens para criar uma página do catálogo que será utilizado para a impressão pdf. Quando eles estão criando a página, precisamos apenas 72dpi imagens para exibir na tela, mas para impressão, precisa dos 300dpi imagens. Obviamente, eles não querem adicionar uma imagem de 3000x3000px para a página, por isso precisa ser redimensionada para a área de exibição correto, por exemplo, 500x500px etc.

Foi útil?

Solução

Esta se resume a um simples redimensionamento da imagem. A discussão dos DPIs é apenas dados auxiliares para calcular o fator de escala.

Como @Guffa disse, você deve fazer isso no momento do upload de modo que você pode apenas servir imagens estáticas no seu visualizador.

Esta será uma carga no servidor:

  1. Coloque a imagem completa. Este será cerca de 27 MB de memória para suas 3000x3000 imagens.
  2. Redimensionar. Lote de matemática feito preguiçosamente (ainda intensivo da CPU).
  3. Compress. Mais CPU + Custo de escrever para a unidade.

Uma vez que você já está tomando o tempo para gerar uma miniatura, você pode amortizar esse custo e esse custo por não ter que repita o Passo 1 acima (ver o código).

Depois de uma imagem é uplaoded, eu recomendaria girando fora um fio para fazer este trabalho. É uma carga sobre o servidor web, com certeza, mas você é única outra opção é dedicar uma segunda máquina para realizar o trabalho. Ela terá de ser feito eventualmente.

Aqui está um código para fazer o trabalho. As linhas importantes são estes:

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

Podemos redimensionar a imagem big no entanto que precisamos. Na primeira linha que acabamos de escalá-lo para baixo por uma escala fixa (72,0 / 300,0). Na segunda linha, se forçar que a imagem tenha uma dimensão máxima final de 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"));

Outras dicas

Se eu entendo o que você quer - você está tentando fazer um gif ou jpg miniatura de uma tif resolução muito alta, para exibição na web - se não, peço desculpas antecipadamente ....


Se você quiser a miniatura para ser 500x500px, que é a resolução do jpg / gif você vai querer criar - 500x500, ou pelo menos 500x <500 ou <500x500 (para caber na caixa, a menos que queira distorcida imagens).

Para exibição na web, o DPI não importa. Basta usar a resolução de pixels que deseja diretamente.

Tecnicamente, o JPG / GIF é criada em 72 DPI pelas classes de imagem em .NET. Mas o DPI realmente não tem qualquer significado para o navegador - ele só usa as dimensões 500x500

.

Quando exibir uma imagem em um Web, a configuração de dpi (ou mais corretamente ppi) é irrelevante. É apenas o tamanho em pixels que é relevante.

Você pode converter uma imagem em tempo real, mas é muito trabalho intensivo para o servidor para fazer que cada vez que a imagem é exibida. Você deve criar os tamanhos que você precisa quando o usuário carrega a imagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top