Guia

Acesso às Imagens

As imagens RGB são tratadas como componentes independentes, utilizando para tanto um ponteiro para cada componente. No caso de imagens Indexadas existe apenas um ponteiro para os índices e um ponteiro para a palette.

O tipo dos ponteiros para as componentes devem ser UNSIGNED CHAR. O ponteiro para a palette é UNSIGNED LONG. O tamanho em bytes dos ponteiros para as componentes é sempre Linhas x Colunas. A localização de cada pixel é feita deslocando-se o ponteiro de um offset calculado pela fórmula:
pixel(x,y) = Buffer[y * Width + x]
assim, nota-se que a primeira linha da imagem fica no fim do ponteiro. As cores na palette são armazenadas como um valor de 32 bits compacto, são fornecidas duas funções para codificação e decodificação deste valor nas componentes RGB.

Exemplos

Foram implementados 4 exemplos que demonstram a funcionalidade da biblioteca. O programa iminfo mostra informações sobre a imagem contida em um determinado arquivo. O programa imconvert converte imagens de um formato em outro. O programa imquantize converte uma imagem 24 bpp em uma imagem de 8 bpp tentando manter a qualidade o melhor possível. O programa imview visualiza uma imagem em uma janela usando as bibliotecas IUP e CD. Todos os 4 exemplos são portáveis e foram testados em todos os ambientes, exceto em Windows 3.xx + Win32s onde imconvert, imquantize e iminfo não funcionam pois não existe um linha de comando 32 bits nesse ambiente.

Variáveis e Tipos

Para manipular as imagens é necessário a declaração de variáveis tais como:

int Width; // Largura da imagem.
int Height; // Altura da imagem

int Type; // Tipo de imagem no arquivo (0 = RGB, 1 = MAP).

unsigned char *Red, *Green, *Blue; // A imagem RGB.

unsigned char *Map; // A imagem Map.
long * Colors; // A tabela de cores para a imagem Map.
int PalSize; // Numero de cores presentes na tabela.

Inicialização

A função imImageInfo retorna informação sobre a imagem contida no arquivo. Com esta informação pode-se reservar memória para a imagem. Que sempre é feito da maneira a seguir:

Map ou Red ou Green ou Blue = (unsigned char *)malloc(Width * Height);

e para a paleta de cores:

Colors = (long *)malloc(PalSize * sizeof(long));

Leitura e Escrita

A imagem pode ser lida usando-se as funções imLoadRGB ou imLoadMap. A função imLoadMap só pode ser executada para arquivos que contenham uma imagem com 8 bits por pixel ou menos. A função imLoadRGB pode ser usada em qualquer situação, RGB ou MAP. Convém lembrar que certos formatos possuem tipos de imagens que não se enquadram nos dos tipos definidos, RGB e MAP.

A imagem pode ser salva usando-se as funções imSaveMap ou imSaveRGB.

Verifique no arquivo IM.H os códigos de erro retornados por essas funções.

A especifição do formato de arquivo e compressão são feitas atravéz de uma única variável. Para tanto a informação sobre o formato vem no primeiro byte (0x00FF) e a informação sobre a compressão vem no segundo byte (0xFF00).

Cores

As cores na paleta são codificadas, para poderem ser manipuladas deve-se usar as funções imEncodeColor e imDecodeColor para transformar valores RGB em uma cor no formato da IM. A codificação de cor usada é a mesma usada na bilbioteca CD.

Quando a tela possue apenas 256 cores ou menos e a imagem é RGB, pode-se utiizar a função imRGB2Map, que converte de maneira ótima, uma imagem RGB em uma imagem de 256 cores ou menos.

Uso com a Biblioteca CD - Canvas Draw

A biblioteca foi preparada para ter um ajuste perfeito com o CD.

A função cdGetImageRGB captura uma imagem do canvas ativo. As funções cdPutImageRGB e cdPutImageMap coloca uma imagem RGB ou indexada no canvas ativo respectivamente, estas funções permitem reduzir ou ampliar a imagem ao colocá-la no canvas.

Em dispositivos com 256 cores é recomendado o uso da função cdPalette antes de desenhar a imagem para melhorar sua qualidade.

Implementando um Novo Formato

A implementação de um novo formato requer um esforço menor do que o normal. A IM supõe que todo formato de image possue a estrutura Header+ColorMap+Data ou Header+Data+ColorMap. Para imagens RGB o ColorMap não existe. O Header contém todos os dados sobre a imagem e o arquivo. E Data contém a imagem organizada por linhas, comprimida ou não.

Usando apenas algumas funções para cada formato, todas as funções da IM são implementadas. As funções necessárias de cada formato são Open/ColorMap/Line/LineRGB para Read e Write mais a função Close, totalizando 9 normalmente pequenas funções.

São fornecidos dois arquivos: imxxx.c e imxxx.h para serem usados como modelo para a implementação de um novo formato. Esses arquivos acessam o arquivo IMIO.H que contém a definição de um arquivo de imagem imFile e de um formato de arquivo de imagem imFormat. Veja no arquivo IMIO.H para maiores detalhes.

A aplicação que for usar esse formato deve incluir o arquivo IMXXX.H, e antes de chamar qualquer função da IM, chamar a função imAddFormatXXX, que garantirá a inclusão do formato na lista interna de formatos da IM. Para usar os formatos da distribuição da IM essa inicialização não é necessária, pois é feita pela prórpia IM. Pode-se então usar a macro IM_XXX para salvar o arquivo no formato desejado ou saber se um determinado arquivo está naquele formato.

Acessando Arquivos Virtuais

Todo acesso a arquivos da IM é feito por um conjunto de funções definidas no arquivo BINFILE.H. Essas funções já cuidam da questão de ordem dos bytes IntelxMotorola e permitem sua configuração para acessar um área de memória em vez de um arquivo, basta usar a função binFileSetMemoryFunctionTable onde o nome do arquivo será na realidade o buffer de leitura/escrita. Para voltar a acessar arquivos normalmente deve-se usar a função binFileSetStreamFunctionTable.

Pode-se ainda criar um acesso completamente personalizado criando-se um driver de acesso com funções do tipo Open/Close/Read/Write/SeekTo/etc... Permitindo por exemplo que uma imagem seja lida diretamente de um campo longo em um banco de dados.

Para maiores detalhes veja o arquivo IMIO.H.