Bitmaps em AdvPL – Parte 07

Introdução

No post anterior, vimos os métodos Cut(), Copy(), Paste() e FlipH(). Agora, vamos ver o suporte a cores, desde o monocromático até 24 bits (ou True Color).

Mapa de Cores

Nas versões de cores implementadas até agora — monocromático, 16 cores e 256 cores — exite uma informação entre o Header do Bitmap e a área de dados, onde é armazenada a tabela de cores em uso. São 4 bytes para cada cor armazenada na tabela, no  formato BGRA ( Blue, Green, Red e Alpha). No Bitmap monocromático, são apenas duas cores ( 0,0,0,0 e 255,255,255,0 ou Preto e Branco), tando que a representação de pontos da imagem no Bitmap Array é feita por BITS — cada Byte representa o estado de 8 pixels ( 0=preto, 1=branco).

No Bitmap de 16 cores, existem 16 cores na tabela padrão após o Header, que podem ser trocadas no mapa. Cada byte da área de dados usa 4 bits (ou um nibble) para representar a posição do mapa de cores para aquele ponto. Por isso o Bitmap de 16 cores utiliza 4 bits por pixel (4 BPP).

No Bitmap de 256 cores, como é de se esperar, o mapa de cores têm 256 cores pré-definidas, e cada pixel no mapa de dados da imagem é representado por um byte inteiro, contendo o valor da cor no índice, de 0 a 255.

Já no Bitmap de 24 bits (também conhecido por True Color), não há mapa de cores. Cada pixel no mapa de dados da imagem é representado por uma sequência de 4 bytes, n formato BGRA, que corresponde a uma cor distinta. Como cada uma das três cores possui intensidades de 0 a 255, isso permite representar mais cores do que o olho humano é capaz de distinguir — total de 16.777.216 cores. Naturalmente um Bitmap com esta definição de cores ocupa aproximadamente 4 vezes mais de tamanho do que o mesmo Bitmap em 256 cores.

Representação da cor em cada ponto

A propriedade ::aMatrix da classe ZBITMAP contém apenas o número de uma cor, quando usado qualquer um dos formatos inferior a 24 bits. Quando usamos esta capacidade de cores (True Color), ainda assim cada ponto apenas possui um número que representa aquela cor. Ele é formado pela conversão para decimal da representação binária das cores Vermelha, Verde e Azul (RGB) em sequência. Por exemplo, existe um tom de vermelho chamado “Tomate”, sua representação em RGB é 255, 99, 71 (decimal).

RGB ( 255 , 99 , 71 ) em 24 bits, nesta ordem, é :
255 = 11111111
 99 = 01100011
 71 = 01000111

Representação final : "111111110110001101000111"
Convertendo esta sequencia para decimal, temos o número 16737095

Logo, um ponto com a cor 16737095 corresponde ao tom de vermelho “tomate”. Quando o Bitmap de 24 bits é carregado, as cores são convertidas nesta representação numérica decimal. No momento de gravar a imagem após uma alteração, os números são reconvertidos para a sequência binária de 24 bits, e cada grupo de 8 bits gera um byte com o valor da respectiva cor.

Mudança no método NEGATIVE

O efeito de foto negativa, anteriormente feito alterando a tabela de cores, deve ser realizado ponto a ponto no Bitmap de 24 bits, aplicando a mesma regra do complemento para as cores RGB — 255 menos a cor. O método fica assim:

METHOD Negative()  CLASS ZBITMAP
Local nI
Local nL , nC
Local nRed := 0
Local nGreen := 0
Local nBlue := 0

If ::nBPP < 24
	// Formatos menores que True Color, altera a tabela de cores
	For nI := 1 to len(::aColors)
		::aColors[nI][1] := 255-::aColors[nI][1]
		::aColors[nI][2] := 255-::aColors[nI][2]
		::aColors[nI][3] := 255-::aColors[nI][3]
	Next
Else
	// Imagem True Color, inverte as cores ponto a ponto                      
	For nL := 1 to ::nHeight
		For nC := 1 to ::nWidth
			RGB2Dec(::aMatrix[nL][nC],@nRed,@nGreen,@nBlue)
			nRed := 255 - nRed
			nGreen := 255 - nGreen
			nBlue := 255 - nBlue
			::aMatrix[nL][nC] := RGB(nRed,nGreen,nBlue)
		Next
	Next
Endif
Return

Em memória, as cores são armazenadas e calculadas em RGB, apenas na leitura e gravação a ordem é invertida para o formato de armazenamento (BGR).

Conclusão

Fonte atualizado no GITHUB, divirta-se 😀

E desejo a todos TERABYTES DE SUCESSO !!!

Referências

 

Um comentário sobre “Bitmaps em AdvPL – Parte 07

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s