Um fotomosaico ou mosaico fotográfico é uma fotografia construída a partir de imagens menores, ou “pastilhas” (do inglês tiles). As pastilhas são escolhidas de forma a reproduzir a cor e intensidade luminosa do bloco da imagem original correspondente, gerando um efeito visual muito interessante.
Para facilitar a leitura e escrita dos arquivos de imagem, neste projeto será adotado o formato de imagem Portable PixMap (PPM), um formato de imagem colorida bem simples e fácil de ler/escrever. Boa parte dos programas de tratamento de imagens reconhece o formato PPM.
A estrutura básica de um arquivo PPM é bem simples:
TYPE (tipo de imagem: P3 ou P6, vide abaixo) WIDTH HEIGHT (largura e altura da imagem em pixels) MAX (valor máximo de cada cor) R0 G0 B0 R1 G1 B1 ... (valores Red/Green/Blue de cada pixel, entre 0 e MAX)
Um exemplo de imagem PPM ascii (P3):
P3 # this is a comment 10 10 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 255 254 254 255 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 215 214 218 145 145 213 120 119 241 224 224 254 253 253 255 255 255 255 255 255 255 255 255 255 255 255 236 209 209 217 60 59 219 52 53 222 56 56 215 56 55 229 184 183 255 254 254 255 255 255 255 255 255 255 254 254 209 103 103 224 54 55 239 96 47 236 86 46 228 58 57 213 126 126 255 254 254 255 255 255 255 255 255 255 255 255 209 93 93 228 55 56 240 120 41 238 99 44 229 59 59 213 123 123 255 254 254 255 255 255 255 255 255 255 255 255 217 151 151 220 53 52 233 60 59 225 53 53 218 57 57 230 191 191 255 254 254 255 255 255 255 255 255 255 255 255 250 246 245 208 183 158 200 94 84 181 123 94 201 165 133 229 234 203 255 255 255 255 255 255 255 255 255 255 255 255 253 253 251 192 210 139 127 169 65 122 166 64 156 186 87 229 236 204 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 253 172 200 141 201 220 182 254 254 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 250 251 248 253 254 253 255 255 255 255 255 255 255 255 255 255 255 255
Você pode usar as imagens que quiser neste projeto. Para perceber melhor o efeito de mosaico, use imagens de grandes dimensões (acima de 3000 pixels de largura). Para gerá-las, pode usar qualquer editor de imagens que ofereça a possibilidade de “salvar como” PPM. No Linux, os softwares Gimp e GThumb oferecem essa opção.
Construir um programa em C (C99 ou similar) que leia uma imagem de entrada em formato PPM e gere como saída essa mesma imagem convertida em mosaico, no mesmo formato e dimensões da imagem de entrada, usando as pastilhas disponíveis em um diretório informado.
A estratégia básica de composição do mosaico é simples:
A cor predominante de um bloco pode ser calculada pela média simples das componentes RGB dos pixels que compõem esse bloco. Alguns autores sugerem, no entanto, usar a raiz quadrada da média dos quadrados das componentes RGB para obter um resultado mais preciso. A mediana das componentes RGB também pode trazer bons resultados.
A distância entre duas cores A = [ RA GA BA ] e B = [ RB GB BB ] é relativamente complexa de calcular, pois as cores não se comportam de forma linear para os olhos humanos. Uma fórmula simplificada de cálculo no padrão RGB é a distância Red Mean, descrita nesta página.
$ mosaico [ -p diretório ] [ -i arquivo ] [ -o arquivo ]
Opções:
-i
: indica a imagem de entrada; se não for informada, assume-se a entrada padrão (stdin).-o
: indica a imagem de saída; se não for informada, assume-se a saída padrão (stdout).-p
: indica o diretório de pastilhas; se não for informado, assume-se o diretório ./tiles
.-h
: gera uma mensagem de ajuda na saída de erro (stderr), explicando o que o programa faz e quais as opções disponíveis.Essas opções podem ser usadas em qualquer ordem:
// entrada e saída em arquivos mosaico -i input.ppm -o output.ppm mosaico -o output.ppm -i input.ppm // entrada em arquivo, saída em stdout, vice-versa ou ambos mosaico -i input.ppm > output.ppm mosaico -o output.ppm < input.ppm mosaico < input.ppm > output.ppm // as opções podem estar em qualquer ordem mosaico -p /tmp/tiles -i input.ppm -o output.ppm mosaico -i input.ppm -p /tmp/tiles -o output.ppm mosaico -o output.ppm -i input.ppm -p /tmp/tiles
O programa deve indicar sua atividade (em stderr
):
Reading tiles from ./tiles 1419 tiles read Tile size is 20x20 Calculating tiles' average colors Reading input image Input image is PPM P3, 3000x4496 pixels Building mosaic image Writing output file
mosaico
../tiles/
).structs
e alocação dinâmica de memória para todas as imagens; só aloque a memória para os pixels após encontrar o tamanho da imagem.all
(default), clean
e purge
.CFLAGS = -Wall
Makefile
Para carregar as pastilhas, você terá de percorrer o diretório de pastilhas, encontrar os nomes de todos os arquivos e ler as imagens contidas neles. Existem funções específicas em C para manipular diretórios, que são descritas nesta página.
system()
e popen()
para varrer o diretório de pastilhas usando comandos do shell. Essas funções lançam processos externos e são ineficientes e inapropriadas neste caso, pois existem funções adequadas para resolver o problema dentro da própria linguagem C.
Coleções de pastilhas prontas para uso:
Para os curiosos, o procedimento que usei para a construção dessas coleções de pastilhas foi o seguinte:
$HOME/.mozilla/…/cache/
) para um diretório separado e remover os que não forem imagens ou não forem relacionados ao tema de interesse.mogrify
faz parte do pacote ImageMagick):$ mogrify -format ppm -thumbnail 32x32^ -gravity center -extent 32x32 *
-compress none
Fonte: https://superuser.com/questions/275476/square-thumbnails-with-imagemagick-convert