Anatomia de uma Imagem GIF
Primeiro uma correção: o padrão GIF não é exatamente uma imagem, ou não é apenas uma imagem. Ele, na verdade, descreve um fluxo de informações gráficas entre dois dispositivos e como tais informações deverão ser interpretadas no destino.
Este formato é um copyright da Compuserve e é apenas esta entidade que tem autoridade para alterar o padrão. O padrão GIF é definido em termos de blocos e sub-blocos que compõe o fluxo. Espera-se que todas as imagens que estão em um único fluxo compartilhem algum tipo de característica, caso contrário é mais negócio defini-las em fluxos separados.
Existem versões do padrão (a 87 e a 89). Tal referência aparece no cabeçalho do fluxo e determina o conjunto mínimo de capacidades requeridas pelo programa decodificador para que este possa mostrar a imagem.
Codificador
É o programa que transforma uma imagem em um fluxo GIF. Suas responsabilidades:
a) Incluir todos os blocos de informação necessários para reproduzir a imagem;
b) Incluir, no header, o menor número de versão de decodificador que consiga abranger todas as características da imagem;
c) Assegurar uma codificação que permita otimizar a decodificação. Evitar ao máximo informação redundante;
d) Evitar agrupar, no mesmo fluxo, gráficos que exijam o reset em parâmetros de hardware;
e) Zerar todos os bits que estejam marcados como reservados para esta versão.
Decodificador
É o programa que recebe um fluxo GIF e apresenta a imagem. Tem duas responsabilidades:
a) Apresentar as imagens resultantes do fluxo, buscando não introduzir nenhum retardo que não seja o especificado no fluxo.
b) Estabelecer os parâmetros de hardware de maneira a acomodar as especificações do fluxo.
Tabelas de Cores
O formato GIF usa dois tipos de tabelas de cores: locais e globais. Uma tabela de cores global é usada por todas as imagens do fluxo que não tenham tabelas locais associadas. O fluxo só pode ter uma
tabela global, e esta pode ser temporariamente sobrepujada por uma local. Uma tabela local serve apenas para o gráfico que a sucede no fluxo. Ambas são opcionais.
Sub-blocos de Dados
Os sub-blocos de dados são unidades contendo dados. Eles não tem um label, começam sempre por um byte de tamanho (que exclui este byte de tamanho) que pode variar entre 0 e 255. Terminam por um terminador contendo zero binário: 0x00.
Header
Formado por 6 bytes, sendo os 3 primeiros iguais a GIF e os outros 3 contendo a versão usada para formatar o fluxo. O padrão recomenda que não se assuma que um arquivo que tenha um GIF nestas posições seja de fato um GIF.
Bloco: HEADER Tamanho: 6 bytes Identificador: não tem
Bytes |
Formato |
Conteúdo |
Descrição |
0 a 2 |
3 bytes alfabético |
GIF |
Identificação do arquivo. |
3 a 5 |
3 bytes alfabético |
87a ou 89a |
Versão mínima que tenha funcionalidades necessárias para processar este fluxo. |
Descritor de Tela Lógica
Contém os parâmetros necessários para delimitar a área da imagem. As coordenadas neste bloco se referem ao canto superior esquerdo de uma tela virtual e nunca são coordenadas absolutas. Este bloco é obrigatório e deve aparecer depois do header.
Bloco: DESCRITOR DE TELA LÓGICO
Tamanho: 7 bytes
Identificador: não tem
Obrigatório
Bytes |
Formato |
Conteúdo |
Descrição |
0 e 1 |
inteiro sem sinal |
Largura da imagem em pixels |
Valor máximo 65.536 |
2 e 3 |
inteiro sem sinal |
Altura da imagem em pixels |
Idem |
4 |
bit 0 |
Indicador de tabela de cores global |
0 = não há 1 = vem a seguir |
|
bits 1, 2 e 3 |
Resolução de cores |
Dá o número de bits (menos 1) que cada cor original tem. Assim, 7 aqui, indicará 8 bits para verde, 8 para azul e 8 para vermelho, ou seja true-color. |
|
bit 4 |
Indicador de classificação da tabela global de cores |
Se =1, a tabela global está classificada com as cores mais freqüentes no começo (Obs1). |
|
bits 5, 6 e 7 |
Tamanho da tabela global de cores |
Para conhecer este número calcule 2 elevado ao número que está aqui, mais 1. Assim, se tiver 0 lá, serão 2 cores (20 + 1 =2). |
5 |
byte |
Índice da cor de background (Obs2) |
Se o indicador de tabela de cores global é zero, este campo é ignorado e deve ser zero. |
6 |
byte |
Razão de aspecto (Obs3) |
Número que varia entre 1:4 e 4:1 e determina a relação entre altura e largura da imagem original. |
Obs1: Usado para permitir ao decodificador que tenha um conjunto pequeno de cores disponíveis, a escolher as mais importantes (que estarão no início da tabela).
Obs2: O índice de background diz qual a cor (da tabela global de cores) que será usada para pintar pixels que não sejam cobertos por nenhuma imagem.
Obs3: A razão de aspecto: Se este campo é zero, nenhuma ação é tomada. Se varia entre 1..255, este número é usado na fórmula:
aspecto = (valor do campo + 15) / 64
Tabela de Cores Global
Seqüência de bytes representando triplas de vermelho-verde-azul. O tamanho desta tabela é de 3 x 2 tamanho da tabela global de cores + 1. Varia entre 6 e 768 bytes.
Descritor de Imagem
Cada imagem no fluxo deve ter o seu descritor de imagem. Pode existir ilimitadas imagens (cada uma com seu descritor) no fluxo.
Bloco: DESCRITOR DE IMAGEM
Tamanho: 10 bytes
Identificador: 0x2C
Obrigatório ao menos 1
Bytes |
Formato |
Conteúdo |
Descrição |
0 |
byte, 0x2C |
Separador de imagens |
|
1 e 2 |
inteiro sem sinal |
Posição esquerda da imagem |
Deslocamento em pixels em relação a margem esquerda da tela. |
3 e 4 |
inteiro sem sinal |
Posição do topo da imagem |
Deslocamento em pixels em relação a margem superior da tela. |
5 e 6 |
inteiro sem sinal |
Largura da imagem |
Em pixels. |
7 e 8 |
inteiro sem sinal |
Altura da imagem |
Idem. |
9 |
bit 0 |
Indicador de tabela de cores local |
0 = não há 1 = vem a seguir deste descritor |
|
bit 1 |
Imagem entrelaçada |
0 = não entrelaçada 1 = entrelaçada |
|
bit 2 |
Indicador de classificação da tabela de cores local |
Se =1, a tabela local está classificada com as cores mais freqüentes no começo. |
|
bits 3 e 4 |
Reservado |
Zeros. |
|
bits 5, 6 e 7 |
Tamanho da tabela local de cores |
Para conhecer este número calcule 2 elevado ao número que está aqui, mais 1. Assim, se tiver 0 lá, serão 2 cores (20 + 1 = 2). |
Tabela Local de Cores
Mesma especificação da tabela global de cores.
Dados da Imagem
Um conjunto de sub-blocos de tamanho máximo de 255 bytes cada, contendo os índices dentro da tabela de cores ativa para cada pixel da imagem. A ordem é da esquerda para a direita e de cima para baixo. A seqüência de pixels é ainda codificada e comprimida usando o algoritmo LZW com códigos de tamanho variável.
O primeiro byte deste bloco é o número inicial de bits usados pelo código LZW, seguido dos sub-blocos de dados.
Extensão do Controle
Bytes |
Formato |
Conteúdo |
Descrição |
0 |
byte |
0x21 |
Identificador de extensão. |
1 |
byte |
0xF9 |
Identificador de extensão de controle. |
0 |
byte |
Tamanho deste bloco |
Sempre igual a 4. |
1 |
bit 0 a 2 |
Reservado. |
Zeros. |
|
bits 3, 4 e 5 |
Método de substituição. |
0 = nada a fazer 1 = não há substituição. O gráfico deve ser deixado onde está. 2 = a área usada pelo gráfico deve ser retornada à cor de background. |
|
bit 6 |
Aguardar ação do operador. |
Se 0 não aguarda operação do operador. Se = 1, aguarda (enter, click, etc). |
|
bit 7 |
Cor para transparência. |
Se 0 não é estabelecido uma cor para transparência. Se =1 há uma cor transparente. |
2 e 3 |
Inteiro sem sinal |
Retardo. |
Especifica a quantidade de centésimos de segundo que se deve esperar antes de continuar a processar o fluxo. |
4 |
byte |
Cor transparente. |
(Se bit7 = 1) indica a cor que, quando presente, deve deixar o que já existe naquele pixel, seguindo o processamento para o próximo. |
0 |
0x00 |
Terminador do bloco. |
Notas: O método 3 de substituição deve ser usado pouco, pois impõe severa carga sobre o decodificador. Se largas áreas devem ser guardadas, é conveniente que elas venham como sub-imagens dentro do fluxo.
Quando há entrada do usuário, o sistema aguarda a quantidade de tempo especificada. Se a quantidade de tempo for zero, a espera pode ser infinita. Por isso, recomenda-se que a entrada do usuário sempre esteja associada a um determinado tempo.
Extensão de Comentário
Usada para descrever textualmente informações na imagem.
0 |
1 |
0x21 |
0xFE |
1 a 255 |
bloco |
1 a 255 |
bloco |
|
0x00 |
Os blocos são seqüências de sub-blocos, cada um de 1 a 255 bytes, com o tamanho em um byte precedendo os dados
Extensão de Texto Plano
Usado para imagens de texto monoespaçado, usando-se caracteres ASCII de 7 bits. Identificado por 0x21, seguido de 0x01.
Por exemplo:
Finalmente, aqui está um exemplo de arte ASCII mostrando a estação de trens em Dunedin, Nova Zelândia.
Extensão de Aplicação
0x21 seguido de 0xFF. Dados de aplicações.
Trailer
Contém um terminador do fluxo e é um 0x3B.
Imagens Entrelaçadas
As linhas de uma imagem entrelaçada são arranjadas como segue:
Grupo 1 : Qualquer oitava coluna começando na linha 0 (passada 1);
Grupo 2 : Qualquer oitava coluna começando na linha 4 (passada 2);
Grupo 3 : Qualquer quarta coluna começando na linha 2 (passada 3);
Grupo 4 : Qualquer segunda coluna começando na linha 1 (passada 4).
O exemplo seguinte mostra como as linhas de uma imagem entrelaçada são ordenadas:
Algoritmo LZW
Acrônimo dos nomes dos seus inventores Lempel, Zil e Welch. Lempel e Ziv publicaram suas idéias em 1977 e Terry Welch refinou o algoritmo em 1984. Em síntese, o algoritmo troca conjuntos de caracteres por códigos simples. Não há análise prévia do conteúdo e a compressão ocorre quando um conjunto grande de símbolos é trocado por um único código. Os códigos LZW podem ter qualquer número de bits, mas precisam ser maiores do que a representação de 1 caracter (ou seja, maiores do que 8 bits). Os primeiros 256 códigos são assinalados para o conjunto padrão inicial. Em um exemplo com códigos de 12 bits, de 0 a 255 são caracteres simples e de 256 a 4095 são para seqüências.
Seja um exemplo:
Agora veja se você aprendeu...
Respostas
i e ii) 2 3 23 6 2 C D D G A
iii e iv) 1 1 11 16 7 J I C I A
Um arquivo exemplo
Trata-se de um arquivo de 17 linhas por 17 colunas. Procure localizar tudo o que foi dito acima e boa sorte...