Podemos alterar o tamanho de uma imagem JPEG sem decodificá-la e recodificá-la?

12

Quero converter uma imagem JPEG de 640x480 em 320x240. Eu sei que isso pode ser feito decodificando a imagem JPEG em YCbCr bruto, dimensione-a e recodifique-a em JPEG. Mas é possível, com a codificação JPEG, dimensionar diretamente a imagem sem decodificar?

Necktwi
fonte

Respostas:

14

Você pode, mas somente se o visualizador em JPEG suportar a extensão JPEG SmartScale . O jpegtran pode fazer isso para tamanhos de N / 8, com N = 1..16. Basicamente, o tamanho do bloco DCT é alterado de 8x8 para outra coisa durante a recompressão (por exemplo, 4x4), que efetivamente dimensiona a imagem.

Nota: O SmartScale foi introduzido na versão 8 da biblioteca libjpeg, mas não é amplamente suportado pelos visualizadores.

Um documento que descreve as alterações em detalhes pode ser encontrado aqui: Evolução do JPEG .

EDIT: Parece que a maioria dos espectadores não consegue exibir essas imagens, pois elas são baseadas no libjpeg-turbo. E o libjpeg-turbo optou por não implementar esse recurso . Na verdade, eu tentei alguns programas (no Ubuntu 14.04 e Windows 8) e nenhum deles foi capaz de exibir a imagem reduzida criada usando jpegtrans. Até o Photoshop, IrfanView e GIMP falharam.

EDIT 2: De fato, o Ubuntu e o Fedora nem sequer enviam a biblioteca libjpeg8, mas a substituem completamente pela versão libjpeg-turbo. Portanto, nenhum dos programas será capaz de ler arquivos JPEG SmartScale, exceto alguns binários estaticamente vinculados à biblioteca libjpeg8 original.

jmiserez
fonte
Existe um codec que constrói a imagem que cresce apenas acrescentando mais dados à imagem?
Necktwi
e o jpeg progressivo? Não faz exatamente o que estou perguntando?
Necktwi
Não, isso faz algo um pouco diferente, aumentando a qualidade da imagem (de baixa para cheia), mas a resolução é sempre inalterada ( referência ). No entanto, existe outra extensão JPEG chamada "modo hierárquico", que codifica diferentes resoluções ( veja também aqui ). Mas, novamente, libjpeg-turbo não suporta (veja aqui , procure por "progressivo" no texto).
precisa saber é
1
E para responder ao primeiro comentário, é claro que existem tais codecs. Apenas não JPG. O que você está procurando é chamado de pirâmide de imagem ou representação em várias escalas. Por exemplo, o JPEG2000 usa uma transformação wavelet que cria uma pirâmide wavelet. Existem outras pirâmides, como as pirâmides gaussianas ou da Lapônia. Esse slide apresenta uma boa visão geral de como as coisas funcionam, enquanto o JPEG2000 é discutido aqui e aqui .
jmiserez
Obrigado pela informação sobre os novos formatos JPEG. Não espero que muitas imagens de origem (câmeras, scanners, etc.) as usem ainda.
AFH
3

A resposta curta é não. Uma imagem JPEG usa compactação, o que significa que cada byte de saída depende de todos os outros. Se você alterar o número de bytes da imagem, deverá descomprimir e recomprimir.

Como resultado da recompressão, haverá uma perda de qualidade, pois o JPEG usa a compactação com perda, mas você está perdendo a qualidade mesmo assim ao dividir a resolução. Você pode obter a melhor qualidade possível a partir da imagem de baixa resolução, aumentando o nível de qualidade JPEG ao recomprimir, embora isso obviamente aumente o tamanho do arquivo.

Se você trabalha muito com imagens, é melhor trabalhar em um formato de compactação sem perdas, como PNG, convertendo para JPEG somente quando as imagens são finalizadas, desde que você tenha espaço extra em disco.

AFH
fonte