Qual é o tamanho "ideal" do arquivo de imagens JPEG em relação às suas dimensões?

10

Planejo escrever um script que digitalize mais de 100.000 imagens JPEG e as recompacte se forem "grandes demais" em termos de tamanho do arquivo. O script é a parte mais fácil, mas não sei como categorizar uma imagem como "muito grande".

Por exemplo, há uma imagem de 2400x600px com um tamanho de arquivo de 1,81 MB. O comando save for web do Photoshop cria um arquivo de 540 KB com qualidade e 60 dimensões iguais. Isso representa cerca de 29% do tamanho original.

Agora, estou pensando em usar esses números como orientação. Algo como 540 KB / (2.400 * 600 / 1.000.000) = 375 KB por megapixel. Qualquer imagem maior que isso é considerada grande. Essa é a abordagem correta ou existe uma melhor?

Edição 1: as imagens precisam ser otimizadas para exibição nos sites.

Edição 2: Posso determinar a qualidade de saída desejada experimentando, preciso saber se as imagens são grandes em termos de tamanho de arquivo e dimensões e precisam ser salvas em qualidade inferior.

Salman A
fonte
11
O primeiro comentário de xiota deve ser a resposta! aliás, qual é a sua prioridade? se, por algum motivo, você só precisar de arquivos pequenos, a qualidade poderá sofrer algumas vezes. é fácil criar arquivos JPEG excessivamente grandes sem ganho perceptível de qualidade. detectar e recomprimir essas imagens é uma boa ideia, basta usar a configuração de qualidade jpeg, como disse a xiota.
szulat 9/01/19
18
"Ideal" para que finalidade ? Mesmo dizendo 'uso da web' é um pouco amplo nos dias de hoje. Os espectadores esperados verão as imagens em um telefone compacto? Um smartphone maior? Um bloco ou tablet? Um caderno? Um monitor de computador grande? Uma TV de 60 "8K? Um jumbotron?
Michael C
2
Possível duplicata de Qual qualidade escolher ao converter para JPG?
Hueco
2
Se o script é a parte mais fácil, eis o que eu tentaria na sua situação: defina um limite definido numericamente para o qual a imagem compactada pode diferir da original (por exemplo, soma da diferença de luminosidade de cada pixel). Comece com qualidade inferior (como 60), exporte e, se a diferença do original for muito alta, exporte novamente com qualidade superior até que sua condição de qualidade seja satisfeita (você pode precisar ajustar o cálculo - use escala exponencial ou algo mais sofisticado para obter o melhor resultado).
Pavel

Respostas:

4

Em média , o ponto ideal do JPEG é de cerca de um bit por pixel .

Obviamente, isso varia de acordo com o conteúdo da imagem, porque certos tipos de gráficos (por exemplo, áreas planas e gradientes suaves) são compactados melhor que outros (ruído, texto); portanto, não é um método robusto para aplicar às cegas em todas as imagens.

Você também tem o problema de não ter uma imagem de referência descompactada para comparar, portanto não sabe ao certo qual é a qualidade atual das imagens que possui e quanto mais você pode diminuir a qualidade para continuar aceitável. A qualidade pode ser estimada em certa medida a partir de tabelas de quantização em JPEGs, mas também não é um método confiável (especificamente, o julgamento da qualidade do ImageMagick é muito incorreto para JPEGs com tabelas de quantização personalizadas e otimizadas).

Dito isto, existe uma abordagem prática razoável:

  1. Escolha uma configuração de qualidade JPEG máxima com a qual esteja satisfeito (algo entre 70 e 85).
  2. Recomprima as imagens para esse nível de qualidade.
  3. Se a imagem recomprimida for menor em mais de ~ 10% , mantenha a imagem recomprimida.

É importante não escolher apenas o tamanho menor do arquivo e exigir uma queda significativa no tamanho do arquivo. Isso ocorre porque a recompressão do JPEG tende sempre a diminuir levemente o tamanho do arquivo devido à perda de detalhes causada pela natureza com perdas do JPEG e à conversão para RGB de 8 bits, então pequenas quedas no tamanho do arquivo podem ter uma queda desproporcionalmente grande na qualidade que não vale a pena isto.

Kornel
fonte
4
Foi exatamente isso que fiz no final. Usei o bit por pixel como um guia para filtrar 30.000 imagens entre mais de 100.000 e as recompacte usando a imagemagick com 85% de qualidade. Se a imagem resultante era 50% menor, mantive a nova. Funcionou no meu caso porque as "imagens grandes" foram criadas usando o Photoshop usando 100% de qualidade. As outras 70.000 imagens foram boas em termos de tamanho de arquivo e as compactadas novamente não geraram economia suficiente (porcentagem) ou houve uma perda perceptível na qualidade.
Salman A
11
Gosto do seu segundo parágrafo, mas você tem algum suporte para a regra geral de um bit por pixel (compressão de 24 ×) com a qual você lidera?
Por favor, leia meu perfil
30

O tamanho dos arquivos compactados com JPEG varia dependendo da complexidade da imagem. Tentar controlar o tamanho dos arquivos da maneira que você descreve resultará em uma qualidade de imagem percebida altamente variável.

Considere as seguintes opções:

  • A abordagem suficientemente boa.  Use uma configuração de qualidade que você considere aceitável, como 75. Compare o tamanho do resultado com a imagem original e mantenha o arquivo menor. Consulte Qual qualidade escolher ao converter para JPG?

  • Use um minimizador de JPEG , como JPEGmini ou jpeg-recompressdo arquivo jpeg . Eles são projetados essencialmente para fazer o que você parece estar tentando fazer, mas com mais conhecimento dos componentes internos do algoritmo JPEG.

  • Gere miniaturas de vários tamanhos , como sugere Nathancahill , da perspectiva do desenvolvedor da web.

xiota
fonte
7
Ou se você quiser ir "extremo" na minimização do JPEG, guetzli . Observe os requisitos de memória e tempo.
Philip Kendall
2
Eu tentei guetzli, mas não fiquei muito impressionado. É muito lento e reduz apenas os tamanhos em cerca de 20 a 30%. Com o jpeg-recompress, os arquivos podem ser reduzidos em 80% com o algoritmo smallfry.
xiota 9/01/19
18

Não. Essa é uma abordagem errada.

O tamanho do arquivo em pixels, sim, tem algo a ver com o peso final, mas não é o único fator.

Faça um teste. Pegue um arquivo completamente branco da mesma 2400x600px e salve-o como JPG.

Agora, tire uma foto de uma floresta (mesma 2400x600px) com muitos detalhes e salve-a. Este arquivo será maior usando as mesmas configurações de compactação.

O tamanho final depende desses 3 fatores:

  • Tamanho do pixel
  • Configurações de compactação
  • Conteúdo (detalhe e complexidade da imagem)

Portanto, você não pode e não deve definir o peso com base no tamanho do pixel.


Mas eu entendo o seu problema.

Sem analisar a compactação atual da imagem, é difícil definir o peso "ideal" (que é relativo ao observador ou uso das imagens)

Você provavelmente pode definir uma configuração de compactação e recomprimir "todos eles". Não sei se você deseja fazer isso antes do "upload", o que provavelmente poupará mais tempo do que os salvos pulando alguns deles.

Existem algumas ferramentas que analisam uma imagem e calculam a taxa de compactação atual. Mas duvido que isso seja importante.

Rafael
fonte
Entendo a parte sobre imagem branca versus imagem da floresta. Você sugeriria que eu pegue uma amostra aleatória de imagens, as salve novamente usando o photoshop (qualidade 70) e use a maior proporção de pixels: tamanho do arquivo como referência? Eu estou supondo que aqueles com menor proporção seriam aqueles com menos detalhes.
Salman A
Em relação à sua última frase. A taxa de compactação é, na verdade, aproximadamente o que o OP está calculando, já que é jpeg size / raw sizee raw size = pixel size * number of pixel, pixel sizesendo 3 octetos para um espaço de cores RGB de 24 bits. E, como você diz, essa métrica não é suficiente para determinar se uma imagem está compactada o suficiente.
zakinster
9
@ SalmanA Não, eu sugiro que você abandone completamente essa abordagem. Os JPEGs são tão grandes quanto precisam para fornecer a qualidade especificada. Sua proposta de ver o tamanho da imagem maior em sua amostra com 70% de qualidade é apenas escolher um nível de complexidade de imagem e dizer "Qualquer coisa mais complexa do que isso é muito complexa e será degradada". No entanto, se quase todas as imagens forem menores que esse limite com qualidade de 70%, qual é o problema de ter um número pequeno de arquivos "muito grandes"?
David Richerby
Isso parece corresponder a uma conclusão a que cheguei quando estava considerando uma abordagem para determinar qual de uma série de fotos de um assunto idêntico, mas com resoluções e qualidade diferentes, era a "melhor" (por exemplo, a mais próxima do original).
Michael
10

Desenvolvedor da Web aqui. Aqui está como eu abordaria isso:

1. Determine as dimensões da imagem exibida e as resoluções de tela necessárias.

Sua primeira tarefa é determinar em que tamanho de pixel as imagens serão exibidas. São fotos de produtos em uma loja online? Uma galeria de fotos? Fotos do perfil do usuário? Vários tamanhos diferentes? Faça uma lista das dimensões de pixel necessárias. Verifique se você precisará de imagens @ 2x para telas de alta resolução, como telefones e tablets recentes.

2. Use um script de miniatura para criar novos arquivos de imagem.

Eles são chamados de scripts em miniatura, mas podem ser usados ​​para muito mais do que apenas miniaturas. Existem muitos scripts por aí ou você pode escrever seus próprios. Ao não redimensionar os arquivos originais, você poderá fazê-lo se cometer um erro no script ou perceber que precisa de uma imagem de maior resolução. Uma prática comum é especificar um sufixo no nome do arquivo de saída. Por exemplo:

lena.jpg (Original, 2000x3000)
lena-thumb.jpg (100x150)
[email protected] (200x300)
lena-product.jpg (400x600)
[email protected] (800x1200)

3. Comprimir.

O script de miniatura deve especificar a compactação jpg quando você recorta os novos arquivos de imagem. No entanto, existem outros minificadores por aí que podem reduzir ainda mais o tamanho do arquivo.

nathancahill
fonte
É assim que lidaremos com isso no futuro: peça aos fotógrafos para colocar originais de alta resolução em um diretório, depois use um script para gerar tamanhos menores (várias miniaturas de tamanho e maiores para desktop e celular) e coloque-as em www com URL reescrever. Mas, no momento, não tenho acesso aos originais.
Salman A
6

Embora a resposta de @ Rafael tenha explicado as entradas e saídas da compactação JPEG, tentarei responder à sua web e carregar problemas.

Usar uma imagem em um site (para design ou conteúdo) ditará alguns imperativos: para que minha imagem será usada? Logotipo, foto de capa, miniatura, foto em uma postagem de blog, foto em tela cheia para uma galeria ... Além disso, se você a usar para várias finalidades (por exemplo, uma foto e sua miniatura da galeria), você deseja recusá-la em todos os tamanhos necessários. No entanto, a menos que você esteja criando seu próprio site, a maioria dos serviços da Web hoje em dia gerará imagens de tamanho menor a partir de sua imagem maior para usar no site.

Agora que você conhece o objetivo da sua imagem, o site (ou CMS ou Framework front-end) sempre exigirá um tamanho máximo em pixels para sua imagem estar em conformidade. Os logotipos podem ter no máximo 600x600px, a cobertura do plano de fundo pode ter no máximo 1280x720px, foto de conteúdo para exibição em tela cheia 1920x1080 ou resolução nativa da câmera para conservação absoluta dos detalhes. Verifique o tamanho correto do site para o qual você deseja fazer o upload. Você deseja corresponder pelo menos ao tamanho máximo de pixel necessário, dependendo da proporção que deseja atingir. Cuidado, alguns serviços cortam e ampliam sua imagem se a proporção não for a mesma. Nesse caso, você terá que recriar sua imagem para se ajustar ao tamanho e à proporção máximos necessários.

Em seguida, o site pode impor um limite de tamanho de arquivo (ou não, dependendo da finalidade da imagem). Quanto ao tempo de carregamento da página, quanto mais leve, melhor. No seu exemplo de uma imagem de alta resolução em 2400x600px, 300 a 500kB é um tamanho totalmente fino para o tempo de carregamento. As imagens de conteúdo (como fotos) podem ser mais pesadas se a finalidade da imagem exigir (por exemplo, exibição em tela cheia), até a resolução nativa da sua câmera, se necessário. Se nenhuma indicação for fornecida, pode ser difícil adivinhar o limite de tamanho do arquivo, pois pode depender do equipamento do público-alvo (móvel, desktop ...), da qualidade da rede do país do público-alvo ... Para obter qualidade e serviço máximos, trate a foto uma a uma para obtenha o tamanho mínimo do arquivo sem artefatos visíveis. Para conveniência ou velocidade de processamento, o redimensionamento de script usando um nível geral de compactação satisfatório (cerca de 70 deve ser bom).A resposta do @ xiota também pode ser a ferramenta que você precisa. Defina seu próprio padrão aqui.

TL; DR a finalidade da imagem no site é essencial para o tamanho do redimensionamento / compactação.

jihems
fonte
3

O que você está calculando é o tamanho médio compactado de um pixel de imagem. Se você dividir pelo tamanho de pixel bruto (geralmente 3 octetos para um RGB de 24 bits), obtém a taxa de compactação.

Essa é uma boa métrica que fornece informações sobre o estado de compactação da imagem, mas não basta julgar se a imagem está suficientemente compactada ou não, porque a taxa de compactação não depende apenas do perfil de compactação (algoritmo = JPEG, qualidade = 60/100), mas também no potencial de compactação da imagem: imagens diferentes com o mesmo tamanho bruto e o mesmo perfil de compactação produzirão tamanhos jpeg diferentes porque as imagens são mais ou menos fáceis de compactar (uma imagem em branco é muito fácil de compactar, branca barulho não é).

Devido a isso e porque o perfil de qualidade "usado pela última vez" não é armazenado nesta imagem (nem na estrutura de cabeçalho de metadados ou jpeg), a abordagem mais usada ao republicar imagens com um perfil de tamanho / qualidade de destino é apenas recomprimir (e potencialmente redimensione) tudo (automaticamente), independentemente do estado inicial da imagem.

Sim, você pode recomprimir quando não for necessário, pode até perder espaço se recomprimir com um perfil de qualidade superior, mas esses são casos extremos e, em larga escala, é a coisa mais fácil a ser feita para garantir um perfil de qualidade desejado. Obviamente, você deseja fazer isso apenas uma vez para não degradar gradualmente as imagens e provavelmente deve armazenar duas bibliotecas de imagens: a inicial "intocada" e a "a ser publicada / recomprimida".

Existem muitas ferramentas para recomprimir vários arquivos. Você também pode criar seu próprio script e, usando a pilha técnica correta (principalmente C ++ e libjpeg), pode ser bem rápido, mesmo para arquivos com> 100k.

Se você deseja implementar um processo mais inteligente / complexo, tente experimentar uma lógica de tamanho de compactação / comparação iterativa para estimar o perfil de qualidade original (a compactação com a mesma qualidade deve produzir aproximadamente o mesmo tamanho, com uma alta a qualidade deve aumentar ligeiramente o tamanho e, com uma qualidade inferior, diminuir significativamente o tamanho). Obviamente, isso consumiria muito mais energia da CPU.

zakinster
fonte
As imagens JPG geralmente fazem subamostras do chroma com 4: 2: 2 ou 4: 2: 0 ( en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 ), de modo que os pixels "brutos" que o JPG está compactando têm 2x ou 4x tantos pixels luma quanto cada canal de croma. (Reduzido ao meio na horizontal e talvez também na vertical). Você pode levar isso em consideração ao considerar "quão compactada" é uma imagem. Mas sim, como você diz, essa não é uma grande métrica para o conteúdo de imagem desconhecido.
Peter Cordes
+1 para redimensionar. Em algum momento, você obtém melhor qualidade de imagem diminuindo o tamanho do que reduzindo ainda mais os bits por pixel. Ao contrário dos codecs de vídeo modernos como h.264 ou h.265 (que podem sinalizar o decodificador para facilitar e desbloquear) ou a versão para imagem estática, HEIF, que é um quadro I HEVC (h.265) , o JPEG não ' você não tem nada disso e ficará obstruído com muitos artefatos tocando se você o deixar com fome. Portanto, é necessário reduzir a escala em vez de apenas reduzir a qualidade se você tiver imagens de entrada com resolução muito alta.
Peter Cordes
2
For example there is a 2400x600px image with a file size of 1.81MB.
Photoshop's save for web command creates a 540KB file at 60 quality and same dimensions.    
This is about 29% of original size.

O tamanho original não compactado é 2400 x 600 x 3 = 4.320.000 bytes (4,1 MB), porque a cor de 24 bits é sempre três bytes de dados RGB por pixel . Não há como contornar essa verdade absoluta.

No entanto, o tamanho do JPG também depende dos detalhes da imagem. Grandes áreas lisas (como céu ou paredes pintadas) são mais compactadas, mas áreas com mais detalhes (como uma árvore cheia de folhas) também não são compactadas. Portanto, não há indicador numérico absoluto.

Mas 540 KB é 0.540 / 4.1 = 13% do tamanho original de 4.1 MB . Pode ser 29% do tamanho JPG anterior, mas é 13% do tamanho original não compactado. Isso significa 1/8 do tamanho original não compactado, que geralmente é considerado de qualidade "decente". Não é a melhor qualidade, não é a máxima, mas geralmente decente, talvez boa o suficiente para alguns usos. Apenas dizendo, já é pequeno.

Um arquivo JPG maior tem melhor qualidade de imagem e menor é menor qualidade de imagem. Você precisa decidir o que é bom o suficiente, mas o JPG nunca é "muito grande", pois a qualidade da imagem diminui com a compactação do JPG. A cor de 24 bits possui três bytes por pixel não compactado.

Portanto, a decisão é se você quer pequeno ou bom.

Mas aumentar um JPG existente ainda é pior, pois mais artefatos JPG são adicionados e, uma vez pequenos, os dados são alterados e nunca melhoram.

Os artefatos JPG normalmente mostram duas maneiras, como blocos visíveis de 8x8 pixels de uma cor nas áreas suaves sem detalhes ou como arestas visíveis ao redor das arestas de detalhes.

Se editar e salvar novamente um JPG, artefatos JPG adicionais serão adicionados. Se necessário, é recomendável sempre salvar novamente para corresponder à configuração de compactação original.

WayneF
fonte
O número de 4,1 MB só é verdadeiro se não houver compactação; no entanto, mesmo um JPEG com qualidade perfeita pode ter um tamanho de arquivo menor devido à compactação sem perdas .
Marv
Sim, foi por isso que o chamei de "descompactado", e é assim que todas as imagens digitais são iniciadas, que é, obviamente, o tamanho real e original dos dados, e é por isso que é importante. Sim, mesmo o JPG 100 de nível mais alto é compactado substancialmente menor, sem perdas. JPG sem perdas é um nome impróprio. Não temos programas disponíveis. Seus usos chamam de outra coisa (a Wikipedia diz DNG e alguns Raw). No entanto, o JPEG2 pode oferecer compactação sem perdas, mas com outros problemas, por exemplo, os navegadores da web não suportam a exibição do JPEG2 e as lojas de impressão de fotos provavelmente não o aceitam.
WayneF 9/01/19
Não há como contornar essa verdade absoluta. ... exceto para subamostragem de croma, que o JPEG usa. O JPEG é compactado no espaço de cores YUV (brilho + dois componentes de cor), não RGB. Geralmente 4: 2: 2 ou 4: 2: 0, reduzindo o número de pixels em cada um dos dois canais de croma em 2x ou 4x. en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 . Após a transformação de RGB para YUV e subamostragem, essas informações de resolução de cores desaparecem totalmente e não fazem parte do que JPEG está gastando bits para codificar. Se você quiser olhar para bits / pixel, ele deve estar no formato de cor do JPEG que você está considerando.
Peter Cordes
2
Vamos lá, leia o texto. A segunda verdade absoluta é que ele disse e se referiu especificamente a "não compactado" e disse que a cor de 24 bits sempre foi três bytes por pixel. :)
WayneF
0

O "Save for Web" do Photoshop é, na verdade, um compromisso muito bom entre tamanho e qualidade do arquivo. Portanto, a menos que você tenha requisitos mais específicos, deve fazê-lo. Um conselho típico para desenvolvedores da Web é manter a faixa de qualidade de 50 a 70%. Obviamente, existem exceções: você desejará uma qualidade de 90 a 95% no logotipo da empresa, que deverá sempre parecer ótima (ou até convertê-la para um formato sem perdas) e chegar a 30% em um tamanho grande, mas mal conseguido. fundo da página visível.

Também não se esqueça de redimensionar suas imagens. Uma imagem de 2400x600 ficará ótima em uma tela 4K, mas será redimensionada em telas menores, desperdiçando largura de banda de dados sem nenhuma melhoria visual para o usuário. Verifique o modelo de site que você usará para descobrir a largura ideal para as imagens. Normalmente, no momento da redação deste documento, algo estará entre 1200 e 1300 pixels (veja a resolução mais popular aqui ).

Lembre-se de manter os originais das fotos convertidas em qualidade da Web. Se você precisar retrabalhar ou imprimir esse material, lamentará tê-lo apenas com qualidade de 60% e resolução de 1 Mpix.

Dmitry Grigoryev
fonte