Huffman Image Compressor é uma aplicação em C com interface gráfica construída usando GTK que realiza compressão lossless de imagens utilizando o algoritmo Huffman Coding.
O programa suporta imagens nos formatos:
- JPEG
- PNG
- PPM
A compressão média observada no projeto é de aproximadamente 50% de redução de tamanho, sem perda de qualidade, pois o algoritmo Huffman é lossless.
Em sistemas Linux (Ubuntu/Debian):
sudo apt update
sudo apt install build-essential libgtk-4-dev libjpeg-dev libpng-devEm sistemas Fedora (Workstation):
sudo dnf update
sudo dnf install gcc make gtk4-devel libjpeg-turbo-devel libpng-devel
Bibliotecas utilizadas:
* GTK (GTK4)
* libjpeg
* libpng
### 2. Compilar o projeto
O projeto utiliza Makefile para automação de compilação.
Execute:
```bash
makeIsso irá gerar o executável na pasta:
bin/compressor
./bin/compressorAo executar, uma interface gráfica será aberta.
A interface foi desenvolvida utilizando GTK.
Ela contém dois botões principais:
Abre um seletor de arquivos permitindo escolher uma imagem suportada.
O programa então:
- lê a imagem
- gera um arquivo comprimido .huf
- reconstrói a imagem comprimida
- salva a imagem final na pasta Downloads
Fecha a aplicação.
Huffman Image Compressor
│
├── include
│ ├── bit_io.h
│ ├── huffman.h
│ └── image.h
│
├── src
│ ├── bit_io.c
│ ├── huffman.c
│ ├── image.c
│ └── main.c
│
├── bin
│ └── compressor
│
├── Makefile
└── README.md
Quando uma imagem é selecionada, o processo ocorre da seguinte forma:
Imagem original
│
▼
Leitura da imagem (PNG/JPEG/PPM)
│
▼
Contagem de frequência dos bytes
│
▼
Construção da árvore de Huffman
│
▼
Codificação binária dos dados
│
▼
Arquivo temporário .huf
│
▼
Descompressão automática
│
▼
Imagem comprimida salva
O arquivo .huf é apenas um formato intermediário e é removido após a reconstrução da imagem.
O algoritmo Huffman Coding é um método de compressão sem perda baseado na frequência dos símbolos.
Funcionamento simplificado:
- Conta quantas vezes cada valor aparece nos dados
- Constrói uma árvore binária baseada nessas frequências
- Atribui códigos binários menores para símbolos mais frequentes
- Substitui os dados originais pelos códigos
Exemplo:
| Valor | Frequência | Código |
|---|---|---|
| A | 50 | 0 |
| B | 25 | 10 |
| C | 25 | 11 |
Como valores frequentes usam menos bits, o tamanho total dos dados diminui.
Durante a compressão, é gerado um arquivo intermediário:
imagem.huf
Ele contém:
- header
- informações da imagem
- tabela de frequência
- dados comprimidos em bits
Esse arquivo é utilizado para reconstruir a imagem final e é removido automaticamente após o processo.
Em testes realizados no projeto:
| Imagem | Tamanho original | Tamanho comprimido | Redução |
|---|---|---|---|
| PNG | 5.2 MB | 2.5 MB | ~50% |
| JPEG | 2.9 MB | 1.5 MB | ~50% |
A compressão é lossless, ou seja:
- ✔ quase nenhuma perda de qualidade
- ✔ pixels quase idênticos ao original