Linux Tux in orange background

Como otimizar imagens com o jpegtran

O jpegtran é um utilitário de linha de comando para transformação de arquivos de imagem JPEG, com o mínimo de perda de qualidade.
Nas distribuições Linux Debian 8.2 “Jessie” e no Ubuntu 16.04 LTS “Xenial Xerus” o pacote libjpeg-progs já se encontra instalado.
Se este não for o seu caso, é possível baixar e instalar o programa dos repositórios.
No Ubuntu ou em qualquer outra distro baseada no Debian, use o apt ou o apt-get para fazer a instalação:

sudo apt install libjpeg-progs

Como é possível ver (pelo nome do pacote), trata-se de um conjunto de programas:

  • cjpeg/djpeg — converte arquivos de imagens de outros formatos (especialmente PNM e targa para JPEG e vice-versa
  • rdjpgcom/wrjpgcom — lê/altera a sessão de comentários dentro dos arquivos JPEG
  • jpegtran — transformação sem perda de arquivos JPEG
  • jpegexiforient/exifautotran — manipula a tag de orientação da imagem, dentro do EXIF

No decorrer do texto, vou mostrar como otimizar suas imagens, fazendo uso do jpegtran.
Em seguida, vou mostrar como reduzir o peso de maneira mais significativa e eficiente com o uso da dupla djpeg e cjpeg.

Otimizar suas imagens, antes de fazer o upload, é fundamental para evitar que causem impacto negativo no tempo de carregamento.
A regra é nunca fazer upload de imagens sem tratamento pro seu site.

Este procedimento é fundamental para quem tem um site ou blog e deseja mantê-lo o mais enxuto e eficiente para carregar para seus leitores.

O que o jpegtran faz com suas imagens

O aplicativo executa várias transformações úteis em seus arquivos JPEG.
Ele pode traduzir a representação codificada de um tipo de JPEG para outro — por exemplo, pode transformar um arquivo comum para JPEG progressivo ou vice-versa.
O jpegtran pode alterar certos dados dos seus arquivos de imagem, como a sua orientação: de retrato para paisagem, por exemplo.
O programa trabalha rearranjando os dados comprimidos (DCT coefficients), sem precisar decodificar completamente a imagem — por isto, ele é capaz de fazer transformações sem perda de qualidade (lossless transformation).
Já, com o uso do djpeg (descompressão), seguido do cjpeg (compressão), para obter a mesma conversão, já vai ocorrer perda da qualidade na imagem.
Você vai encontrar mais informações sobre o uso do aplicativo no manual. Na linha de comando, é possível obter informações sobre como usar:

jpegtran -h

Exemplos de uso do jpegtran

Vamos ver alguns exemplos práticos de uso do aplicativo, que podem ser úteis no seu dia a dia.
Para converter uma imagem não-progressiva para progressiva, use os seguintes parâmetros:

jpegtran -progressive Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg > Mercedes-optimized.jpg

No exemplo acima, o primeiro arquivo é o original e o segundo é o novo, criado com as novas alterações.
Use a opção ‘-optimize’, para otimizar seus arquivos:

jpegtran -verbose -optimize Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg > Mercedes-optimized.jpg

Como acrescentei a opção ‘-verbose’, o programa mostra informações detalhadas do trabalho em execução:

libjpeg-turbo version 1.3.1 (build 20150308)
Copyright (C) 1991-2012 Thomas G. Lane, Guido Vollbeding
Copyright (C) 1999-2006 MIYASAKA Masaru
Copyright (C) 2009 Pierre Ossman for Cendio AB
Copyright (C) 2009-2014 D. R. Commander
Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)

Emulating The Independent JPEG Group's software, version 6b  27-Mar-1998

Start of Image
Miscellaneous marker 0xe1, length 22752
Define Quantization Table 0  precision 0
Define Quantization Table 1  precision 0
Define Huffman Table 0x00
Define Huffman Table 0x10
Define Huffman Table 0x01
Define Huffman Table 0x11
Start Of Frame 0xc0: width=3264, height=2448, components=3
    Component 1: 2hx1v q=0
    Component 2: 1hx1v q=1
    Component 3: 1hx1v q=1
Start Of Scan: 3 components
    Component 1: dc=0 ac=0
    Component 2: dc=1 ac=1
    Component 3: dc=1 ac=1
  Ss=0, Se=63, Ah=0, Al=0
End Of Image

Para ver se houve alteração no tamanho da imagem:

ls -l

Como você pode ver, abaixo, a redução no tamanho foi mínima:

total 5644
-rw-r--r-- 1 justincase justincase 2925612 Dez  7 11:32 Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg
-rw-r--r-- 1 justincase justincase 2849006 Dez  7 16:08 Mercedes-optimized.jpg

Para obter uma cópia em escala de cinza, use a opção ‘-grayscale’:

jpegtran -grayscale Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg > Mercedes-optimized.jpg
ls -l

Este tipo de medida costuma trazer resultados mais claros para reduzir o tamanho de um arquivo:

total 4896
-rw-r--r-- 1 justincase justincase 2925612 Dez  7 11:32 Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg
-rw-r--r-- 1 justincase justincase 2080959 Dez  7 16:38 Mercedes-optimized.jpg

Como obter redução significativa no tamanho do arquivo JPEG

Para obter uma redução maior da sua imagem, use a dupla djpeg/cjpeg para descomprimir e descomprimir novamente.
Funciona assim:

djpeg imagem_original.jpg > imagem_descomprimida.jpg
cjpeg image_descomprimida.jpg > imagem_final.jpg
_

Neste caso, vai haver perda da qualidade da imagem — mas é razoavelmente pequena. O ganho com a redução do tamanho é maior.
Na listagem, que segue, temos 4 exemplos de uma imagem:

ls -lh Mercedes*
_
-rw-r--r-- 1 justincase justincase 2,8M Dez  7 11:32 Mercedes-Benz-450SL-1980-by-Thomas-Bersy.jpg
-rw-r--r-- 1 justincase justincase 666K Dez  7 16:47 Mercedes-comprimido.jpg
-rw-r--r-- 1 justincase justincase  23M Dez  7 16:46 Mercedes-descomprimido.jpg
-rw-r--r-- 1 justincase justincase 2,8M Dez  7 16:45 Mercedes-optimized.jpg
  • O primeiro arquivo é o original (2,8 Mb);
  • o terceiro foi descomprimido a partir do original (23 Mb);
  • o segundo foi comprimido a partir do terceiro (666 Kb) e
  • o último foi apenas otimizado a partir do original.

Veja a imagem original:

… e a cópia comprimida:

Consegue perceber as diferenças entre as 2 imagens?
Se você ainda estiver insatisfeito com o tamanho do arquivo comprimido, é possível repetir o processo de descomprimir/comprimir e reduzir ainda mais o seu tamanho.

Referências

Crédito da imagem: Thomas Bersey.

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia. Fã de séries, como "Rick and Morty" e "BoJack Horseman". Me siga no Twitter e vamos trocar ideias!

2 comentários sobre “Como otimizar imagens com o jpegtran”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *