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