Anatomia de uma Imagem GIF

Autor:  Pedro Luis Kantek Garcia Navarro- GAC

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...