jpeg-compressor – codificador JPEG de domínio público em um único arquivo C++

O jpeg-compressor é uma classe em C++ pequena (menos de 1000 linhas) e fácil de usar que cria um arquivo de imagem JPEG. Suporta tons de cinza e os fatores de sub-amostragem de chroma H1V1/H2V1/H2V2, ajustes de qualidade compatíveis com a biblioteca Libjpeg, e é razoavelmente rápida com um baixo consumo de memória (tipicamente menos de 64KB). A classe consiste de um único arquivo C++ com um pequeno arquivo de cabeçalho, junto com algumas funções opcionais de ajuda e exemplo. A versão atual suporta tanto a codificação com Huffman de via única e a mais eficiente (mais também mais lenta) codificação em duas vias, faz uma única alocação dinâmica de memória e aceita imagens de 32 bits.

Como bônus, o código fonte distribuído inclui um decodificador JPEG opcional e completamente independente com suporte a imagem progressiva em um único arquivo de código jpgd.cpp. Os arquivos distribuídos incluem também um exemplo com a solução VS2008/2010 Win32/x64 e um projeto Codeblocks v10.05 (MinGW)

Uso básico (Codificação)

Inclua o arquivo de cabeçalho e chame uma das funções do namespace “jpge”:

  // Writes JPEG image to a file.
  // num_channels must be 1 (Y), 3 (RGB), or 4 (RGBA), image pitch must be width*num_channels.
  bool compress_image_to_jpeg_file(const char *pFilename, int width, int height, int num_channels,
                                   const uint8 *pImage_data, const params &comp_params = params());
  // Writes JPEG image to memory buffer.
  // On entry, buf_size is the size of the output buffer pointed at by pBuf, which should be at least ~1024 bytes.
  // If return value is true, buf_size will be set to the size of the compressed data.
  bool compress_image_to_jpeg_file_in_memory(void *pBuf, int &buf_size, int width, int height, int num_channels,
                                             const uint8 *pImage_data, const params &comp_params = params());

Veja o arquivo tga2jpg.cpp para um exemplo se uso. Esse exemplo usa o módulo stb_image.c de Sean Barrett para carregar os arquivos de imagem. Você pode também chamar a classe jpge::jpeg_encoder diretamente se precisa de mais controle sobre a imagem original ou como e onde o arquivo com a saída será salvo.

Uso básico (Decodificação)

Inclua o arquivo jpgd.h e chame uma das funções do namespace “jpgd”:

  // Loads a JPEG image from a memory buffer.
  // req_comps can be 1 (grayscale), 3 (RGB), or 4 (RGBA).
  // On return, width/height will be set to the image's dimensions, and actual_comps will be set
  // to either 1 (grayscale) or 3 (RGB).
  unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data, int src_data_size,
                                       int *width, int *height, int *actual_comps, int req_comps);
  // Loads a JPEG image from a file.
  unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename, int *width, int *height,
                                       int *actual_comps, int req_comps);

Da mesma forma que no caso do decodificador, para ter mais controle você pode utilizar diretamente a classe jpgd::jpeg_decompressor, ou chamar a função decompress_jpeg_image_from_stream().

O jpgd suporta um super conjunto de recursos do JPEG usado pelo jpge, de forma que pode decodificar qualquer arquivo gerado por ele além de muitos (mas não todos) dos aquivos JPEG que você encontra por aí. Suporta arquivos de imagem JPEG progressivos e sequenciais e os fatores de sub-amostragem de chroma H1V1, H2V1, H1V2, e H2V2

Testando

  • A distribuição inclui uma ferramenta de linha de comando simples chamada jpege.exe que converte as imagens de qualquer formato que stb_image.c suporte (como PNG, TGA, BMP, etc) para JPEG usando a classe jpeg_encoder class. A forma de uso é:
  bin/jpge source_file.png destination_file.jpg quality_factor

Onde quality_factor varia de 1 a 100 (quanto maior melhor).

A ferramenta jpeg.exe inclui também alguns outro modos para teste do codec (opção -x) e decodificação de JPEG para TGA (opção -d) — veja a ajuda para mais informações.