by:Jose Marcos Jackson

Formato GIF (Graphics Interchange Format)

‘GIF’ é um padrão da CompuServe para definir imagens coloridas generalizadas. Este formato permite imagens de alta qualidade e alta resolução serem mostradas em uma variedade de hardwares gráficos. Devido a isso, o formato ‘GIF’ é um padrão usado largamente na Internet, pois possui uma boa qualidade combinado com um tamanho satisfatório de arquivo a ser usado na Web.

O principal objetivo desta descrição, é prover uma visão geral de quais são os componentes de arquivos no formato ‘GIF’, e qual a função de cada um deles. Nesta descrição, nós estaremos nos referenciando à versão ‘GIF87a’ deste formato a menos que seja commentado no ponto específico.

Assinatura ‘GIF’

A assinatura é ‘GIF’ + ano/versão e identifica os dados que se seguem como uma imagem válida. Esta assinatura consiste dos seguintes 6 (seis) caracteres/bytes:

G I F 8 7 a (ou G I F 8 9 a na versão posterior do formato )

Os três últimos caracteres podem ser vistos como ano da versão e o número da revisão. Existem 2 versões para o formato ‘GIF’ a 87a e a 89a.

O Formato Geral de Arquivos ‘GIF’

A figura 1 ilustra os componentes de um arquivo no formato ‘GIF’.

 

Figura 1 - elementos principias do formato

Descritor de Tela

O descritor de tela descreve os parâmetros gerais para todas as imagens ‘GIF’ que se seguem. É nela que está descrita as dimensões do espaço da imagem, informações sobre a cor de fundo, e a informação de profundidade da cor. Estas informações estão guardadas em uma série de bytes como descritos na figura 2 abaixo.

Largura da Tela - inteiro

Altura da Tela- inteiro

M| cr |0|pixel - byte

Background- byte

0 0 0 0 0 0 0 0- byte

Figura 2 - Campos descritores da tela virtual

 

As alturas e larguras lógicas na tela podem ser ambas maiores que o display físico. Como as imagens maiores que o display físico serão trabalhadas é dependente da implementação e pode levar vantagem das características do hardware. Caso contrário as imagens podem ser cortadas nos limites do display. Essas informações ocupam 2 bytes, são inteiros armazenados no formato LSB (least significative byte first) ou formato INTEL. Um valor armazenado neste formato garda primeiro o byte menos significativo.

A valor armazenado da terceira linha é campo de bits. Que significa diversas coisa dependendo dos valores armazenados nas diversas posições do byte.

Os 3 bits menos significativos são chamados de pixel. Isso serve para indicar o número de cores da tabela de cores globais do árquivo e só tem sentido se esta tabela estiver presente. O número de cores será definido como 2 elevado pixel mais 1. Ou seja os valores para ‘pixel’ também define o número máximo de cores dentro de uma imagem. Os limites de valores possíveis para ‘pixel’ vão de 0 a 7 que representa 1 a 8 bits. Isso se traduz para um limite de 2 (Preto e Branco) até 256 cores.

O bit 3 do byte 5 é, na versão 87a, reservado para futuras definições e deve ser 0. Na versão 89a passou a indicar, se 1 que a palete de cores está ordenada em ordem decrescente de ocorrencia.

 

O Mapa de Cores Global

O mapa de cores global é opcional, mas é recomendado para imagens. A existência deste mapa de cores é indicado pelo bit mais significativo, no campo ‘M’ do quinto byte do descritor de tela. O mapa de cores também pode estar associado a cada imagem no arquivo ‘GIF’ como será descrito posteriormente. Contudo, o mapa de cores global geralmente será usado devido a restrições nos equipamentos ainda hoje disponíveis.

Nos Descritores de Imagens individuais, o flag ‘M’ normalmente será zero. Se o mapa de cores global estiver presente, sua definição segue imediatamente o descritor da tela. O número de entradas no mapa de cores é igual a 2**(# bits por pixel), onde cada entrada consiste de (cr+1) bytes representando a intensidade relativa de vermelho, verde e azul respectivamente. O valor de cr corresponde aos 3 bits que seguem M no mesmo byte 5 (figura2). A estrutura do bloco do mapa de cores é a mostrada na figura 3, que se repete para cada uma das cores da tabela de cor:

Intensidade de vermelho

Intensidde de verde

Intensidade de azul

Intensidade de vermelho

Intensidade de verde

Intensidade de azul

Figura 3 - Formação das cores na tabela de cores global

Cada valor do pixel da imagem será mostrado de acordo com seu casamento mais próximo com uma cor disponível no display baseado neste mapa de cores. As componentes da cor representam o valor da intensidade de zero (0) até a intensidade máxima (255). O branco seria representado por (255, 255, 255), o preto como (0, 0, 0) e o amarelo médio como (180, 180, 0).

Para o display, se o aparelho suporta menos de 8 bits por componente de cor, serão usados os bits de mais alta ordem de cada componente. Se nenhum mapa de cores global estiver indicado, será gerado internamente um mapa de cores default que mapeia cada possível índice de cor de entrada ao mesmo índice de cor do hardware módulo <n>, onde <n> é o número de cores disponíveis no hardware.

Descritor da Imagem

O Descritor da Imagem define a localização real e a extensão da imagem que se segue dentro de espaço definido no descritor de tela. Também estão definidas flags que indicam a presença de um mapa local de cores, e que definem a seqüência de display dos pixels. Cada descritor de imagem é introduzido por um caractere de separação de imagens. O papel do separador de imagens é simplesmente prover um caractere de sincronização para introduzir o descritor de imagens. Isto é importante no caso de um arquivo ‘GIF’ conter mais de uma imagem. Este caractere é definido como 0x2C hex ou ‘,’ (vírgula). Quando este caractere é encontrado entre imagens, o descritor de imagens vem logo em seguida.

Quaisquer caracteres encontrados entre o final de uma imagem anterior e o caracter de separação de imagens são ignorados na versão 87a. Na versão 89a podem aparecer os blocos de extensões do formato ‘GIF’.

A ilustração da estrutura do descritor de imagem é mostrada na figura 4:

"," ou 0 0 1 0 1 1 0 0 ou (2C)h

Ponto esquerdo da Imagem - inteiro

Topo da Imagem- inteiro

Largura da Imagem- inteiro

Altura da Imagem- inteiro

M|I|0|0|0|pixel

Figura 4- Descritor de imagem

O último byte é novamente um campo de bits. Os valores possíveis dos parâmetros do byte 19 anterior são descrito no figura 5 abaixo:

M = 0 – Usa o mapa de cores global, ignore ‘pixel’

M = 1 – Mapa de cores local se segue, use ‘pixel’

I = 0 – Imagem formatada em ordem seqüencial

I = 1 – Imagem formatada em ordem entrelaçada

Pixel+1 – # bits por pixel para esta imagem

Figura 5 - Significado dos bits do ultimo byte do descritor da imagem - versão 87a

A especificação da posição da imagem e do tamanho devem estar confinados às dimensões definidas pelo descritor de tela. Por outro lado, não é necessário que a imagem preencha toda tela definida.

 

O Mapa de Cores Local

O mapa de cores local é opcional. Se o bit ‘M’ do byte 10 do descritor da imagem está setado, logo um mapa de cores se segue ao descritor da imagem. Esse mapa se aplica apenas a imagem que se segue. Ao final da imagem, o mapa de cores vai reverter àquela definida após o descritor de tela. Note que o campo ‘pixel’ do byte 10 do descritor de imagem é usado somente se um mapa de cores local está indicado. Ele define os parâmetros não apenas para o tamanho da imagem em pixels, mas também determina o número de entradas na tabela de cores que se segue.

Dados da imagem

O formato da imagem real é definido como a série de valores dos índices dos pixels de cor que formam a imagem. Os pixels são armazenados da direita para esquerda seqüencialmente em uma linha da imagem. Por default cada linha da imagem é escrita seqüencialmente, de cima para baixo. No caso do bit ‘I’ estar setado (imagem entrelaçada) no byte 10 do descritor da imagem, então a ordem das linhas segue um processo de quatro passos em que a imagem é preenchida por linhas não sequenciais.

A forma de preenchimento no caso de imagem entrelaçada é:

Uma descrição gráfica deste processo se segue adiante.

Linha

Passo 1

Passo 2

Passo 3

Passo 4

Resultado

0

**1a**

 

 

 

**1a*

1

 

 

 

**4a**

**4a**

2

 

 

** 3a**

 

**3a**

3

 

 

 

**4b**

**4b**

4

 

**2a**

 

 

**2a**

5

 

 

 

**4c**

**4c**

6

 

 

**3b**

 

**3b**

7

 

 

 

**4d**

**4d**

8

**1b**

 

 

 

**1b**

9

 

 

 

**4e**

**4e**

10

 

 

**3c**

 

**3c**

11

 

 

 

**4f**

**4f**

12

 

**2b**

 

 

**2b**

Os valores dos pixels da imagem são processados como uma série de índices de cor que mapeiam as cores descritas no mapa de cores existente. O valor da cor resultante do mapeamento é o que é realmente mostrado. Esta serie de índices de pixels são passados para a stream de dados da imagem, um valor por pixel, comprimidos e empacotados de acordo com a versão do algoritmo de compressão LZW (explicado a seguir).

O Terminador GIF

A fim de prover uma sincronização para a terminação de um arquivo de imagem GIF, um decodificador GIF vai processar o final do modo de GIF quando o caractere 0x3B hex ou ‘;’ for encontrado após a imagem ser processada.

Por convenção, o software de decodificação vai parar e espera por uma ação indicando que o usuário esta pronto para continuar. Esta ação pode ser uma carriage return, um clique do mouse, e etc.

Após isto, o software de decodificação vai tipicamente sair do modo gráfico e finalizar quaisquer processos anteriores.

 

Animação

Quem já não encontrou uma página WWW com animação? Grande parte das animações é produzida de maneira semelhante aos desenhos animados: primeiro é preciso ter os desenhos, geralmente, arquivos *.gif - compondo a seqüência completa da animação desejada; depois, um script, um applet Java, ou um tipo especial de arquivo, ficará encarregado de mostrar os desenhos na ordem especificada para gerar a animação.

Algumas animações são produzidas por scripts CGI, outras por Java, e outras por blocked GIFs (GIFs animadas). Esta ultima é a animação mais simples e é resultado de unir diveras gif em um único arquivo.

Outra possibilidade é realizar animações em programas próprios para apresentação, gerando arquivos de vídeo ou outros formatos que possam ser apresentados através de plug-ins.

Conclusão

Para alguns tipos de imagens, o formato GIF é superior em qualidade de imagem, tamanho de arquivo, ou ambos. O que precisamos saber é para que tipo de imagens devemos aplica-lo. De maneira geral, é melhor aplicado a imagens com pouca variações de cor ou coloridas com tabelas de até 256 cores ou níveis de cinza. Quando não é possível a perda de dados já que este é um formato sem perdas.

Este formato tem larga utilização e bom desempenho. Para alguns tipos de imagens, GIF é superior em qualidade ou em tamanho de arquivo. O formato GIF apresenta melhores resultados em imagens com um pequeno número de cores distintas, como desenhos em linhas e cartões simples.