Pergunta

Esta é realmente uma pergunta em duas partes, já que ainda não entendo completamente como essas coisas funcionam:

Minha situação:Estou escrevendo um aplicativo da web que permite ao usuário fazer upload de uma imagem.Meu aplicativo é redimensionado para algo exibível (por exemplo:640x480-ish) e salva o arquivo para uso posterior.

Minhas perguntas:

  1. Dado um arquivo JPEG arbitrário, é possível saber qual é o nível de qualidade, para que eu possa usar a mesma qualidade ao salvar a imagem redimensionada?
  2. Isso importa?Devo salvar todas as imagens em um nível decente (por exemplo:75-80), independentemente da qualidade original?

Não tenho tanta certeza sobre isso porque, a meu ver:(vamos dar um exemplo extremo), se alguém tivesse uma imagem de 5 megapixels salva com qualidade 0, ela ficaria em blocos como qualquer coisa.Reduzindo o tamanho da imagem para 640x480, o bloqueio seria suavizado e por muito pouco menos perceptível...até que salvei com qualidade 0 novamente...

No outro extremo do espectro, se houvesse uma imagem de 800x600 com q=0, redimensionar para 640x480 não mudará o fato de que parece uma porcaria total, então salvar com q=80 seria redundante.

Estou perto?

Estou usando a biblioteca GD2 em PHP, se isso for de alguma utilidade

Foi útil?

Solução

  1. JPEG é um formato com perdas. Toda vez que você salva uma mesma imagem JPEG, independentemente do nível de qualidade, você reduzirá a qualidade da imagem real. Portanto, mesmo se você obteve um nível de qualidade do arquivo, não poderá manter a mesma qualidade quando salvar um JPEG novamente (mesmo em qualidade = 100).

  2. Você deve salvar seu JPEG com uma qualidade tão alta possível em termos de tamanho de arquivo. Ou use um formato sem perda, como o PNG.

Os arquivos JPEG de baixa qualidade não se tornam mais mais blocos. Em vez disso, a profundidade da cor é reduzida e os detalhes das seções da imagem são removidos. Você não pode confiar em imagens de qualidade inferior, sendo o bloqueio e parecendo bem em tamanhos menores.

De acordo com Jfif spec. O número de qualidade (0-100) não é armazenado no cabeçalho da imagem, embora a densidade horizontal e vertical de pixels seja armazenada.

Outras dicas

Você pode visualizar o nível da compactação por imagemagick. Download e instruções de instalação podem ser encontradas no website oficial.

Depois de instalá -lo, execute o seguinte comando na linha de comando:

identify -format '%Q' yourimage.jpg

E você deve obter o valor de 0 (tamanho de baixa qualidade, tamanho pequeno) a 100 (tamanho grande de alta qualidade).

Fonte de informação

Para futuros visitantes, verificando a qualidade de um determinado JPEG, você pode apenas usar o ImageMagick Tooling:

$> identify -format '%Q' filename.jpg
   92%

O algoritmo de compressão JPEG possui alguns parâmetros que influenciam na qualidade da imagem resultante.

Um desses parâmetros são as tabelas de quantização que definem quantos bits serão utilizados em cada coeficiente.Programas diferentes usam tabelas de quantização diferentes.

Alguns programas permitem ao usuário definir o nível de qualidade de 0 a 100.Mas não existe uma definição comum para este número.A imagem feita no Photoshop com qualidade de 60% ocupa 46 KB, enquanto a imagem feita no GIMP ocupa apenas 26 KB.

As tabelas de quantização também são diferentes.

Existem outros parâmetros, como subamostragem, método dct e etc.

Portanto, você não pode descrever todos eles por um único número de nível de qualidade e não pode comparar a qualidade das imagens JPEG por um único número.Mas você pode criar números como Photoshop ou Gimp, que descreverão o compromisso entre tamanho e qualidade.

Mais Informações:http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html

A prática comum é redimensionar a imagem para o tamanho apropriado e aplicar jpeg depois disso.Neste caso, imagens grandes e médias terão o mesmo tamanho e qualidade.

Como já existem duas respostas usando identify, aqui está um que Também gera o nome do arquivo (para digitalizar vários arquivos de uma só vez):

Se você deseja ter uma saída simples de filename: quality Para uso em várias imagens, você pode usar

identify -format '%f: %Q' *

para Mostre o nome do arquivo + compressão de todos os arquivos no diretório atual.

Então, existem basicamente dois casos com os quais você se importa:

  1. Se uma imagem recebida tiver um conjunto de qualidade muito alto, pode ocupar uma quantidade inadequada de espaço. Portanto, você pode querer, por exemplo, reduzir a entrada q = 99 a q = 85.

  2. Se uma imagem recebida tiver um conjunto de qualidade muito baixo, pode ser um desperdício de espaço para aumentar sua qualidade. Exceto que uma imagem que teve uma grande quantidade de dados descartados não ocupará magicamente mais espaço quando a qualidade for aumentada - imagens em blocos comprimirão muito bem, mesmo em configurações de alta qualidade. Então, na minha opinião, é perfeitamente bom aumentar o Q = 1 para q = 85.

A partir disso, acho que simplesmente forçar uma configuração de qualidade decente é uma coisa perfeitamente aceitável a se fazer.

Aqui está uma fórmula que eu encontrei para funcionar bem:

  1. JPG100size (o tamanho que ele não deve exceder em bytes para 98-100% de qualidade) = largura*altura/1.7

  2. jpgxSize = jpg100size*x (x = por cento, por exemplo, 0,65)

Portanto, você pode usá -los para descobrir estatisticamente em que qualidade seu JPG foi salvo pela última vez. Se você quiser abaixar a qualidade de 65% e se quiser evitar a reamostragem, compare o tamanho inicialmente para garantir que ainda não esteja muito baixo e apenas reduza a qualidade

Cada novo salvamento do arquivo diminuirá ainda mais a qualidade geral, usando valores de maior qualidade, você preservará mais a imagem. Independentemente do que a qualidade da imagem original era.

Se você se resmatar a um JPEG usando o mesmo software que o criou originalmente, usando as mesmas configurações, descobrirá que o dano é minimizado - o algoritmo tenderá a lançar a mesma informação que lançou pela primeira vez. Eu não acho que exista alguma maneira de saber qual nível foi selecionado apenas olhando o arquivo; Mesmo se você pudesse, software diferente quase garante parâmetros e arredondamentos diferentes, tornando quase impossível uma correspondência.

Isso pode ser uma pergunta boba, mas por que você se preocuparia em microgerenciar a qualidade do documento? Acredito que se você usar o ImageMagick para fazer a conversão, ele gerenciará a qualidade do JPEG para você para obter o melhor efeito. http://www.php.net/manual/en/intro.imagick.php

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