Bitmaps em AdvPL – Parte 05

Introdução

No post anterior, vimos a implementação do algoritmo de pintura. Agora vamos ver mais algumas implementações, como por exemplo o traçado de um retângulo (ou um quadrado), a partir das coordenadas informadas, e como é possível gerar a imagem “negativa” a partir da imagem original — igual o negativo de uma fotografia, por exemplo — para quem é do tempo das máquinas fotográficas de filme 😀

Método RECTANGLE

Traçar um retângulo na horizontal ou vertical é um processo mais simples do que traçar uma reta — embora sejam 4 (quatro) retas que formam um retângulo. A implementação deste método traça um retângulo, sem nenhuma “inclinação”. Devido a características desejáveis desta implementação, ele não usa internamente o método Line() — para traçar retas. Depois do código vamos ver por que.

// ---------------------------------------------------
// Desenha um retängulo na cor e espessura especificadas
// Cor e espessura sao opcionais
// Espessura > 1 , preenche a área interna do retängulo 

METHOD Rectangle(L1,C1,L2,C2,nColor,nPen)  CLASS ZBITMAP
Local nL , nC

If nPen = NIL 
	nPen := ::nPenSize
Endif

For nPen := 0 to nPen-1

	// Espessura de linha de retangulo sempre 
	// para a área interna do Retangulo 

	// Traça linhas horizontais
	For nC := C1+nPen to C2-nPen
		::SetPixel(L1+nPen,nC,nColor,1)
		::SetPixel(L2-nPen,nC,nColor,1)
	Next
	
	// Traca as linhas verticais
	For nL := L1+nPen to L2-nPen
		::SetPixel(nL,C1+nPen,nColor,1)
		::SetPixel(nL,C2-nPen,nColor,1)
	Next
	
Next

Return

Uma vez informadas as coordenadas dos extremos do retângulo — por exemplo o ponto superior esquerdo e o ponto inferior direito — a função limita o retângulo nestas coordenadas, e de acordo com a grossura do traço escolhido no parâmetro nPen, as retas adicionais são traçadas ocupando os pontos da área interna do retângulo. Por hora o método ainda não suporta preenchimento, mas quando for implementado, ele não vai usar o método de pintura — a implementação vai ser mais leve e mais simples, apenas preenchendo em sequencia todos os pontos da área interna com a cor desejada.

Método NEGATIVE

Normalmente usado para inverter as cores de uma imagem obtida através de um filme fotográfico do tipo “filme negativo” — o mais conhecido para uso em fotografia. Partindo de uma matriz de cores formadas pela composição RGB — mistura de concentrações diferentes das cores Vermelha (R=Red), Verde (G=Green) e Azul (B-Blue), com intensidade variando de 0 a 255, o negativo de uma cor é obtido com a subtração de 255 menos a intensidade atual de cada cor. Por exemplo: RGB 0,0,0 é a cor preta — nenhum tom das cores. Já a cor branca é a mistura das três cores em tom máximo (RGB 255,255,255). A cor vermelha é representada por RGB 255,0,0 , e a sua cor negativa é o Ciano — obtido através da subtração de 255 de cada uma das cores — RGB 0,255,255.

Como cada bitmap colorido possui uma tabela de cores logo após o header,  o efeito negativo pode ser obtido apenas refazendo a tabela de cores usando a aritmética mencionada acima. Assim, o método fica:

// --------------------------------------------------------
// Faz o "negativo" da imagem 
// Recalcula as cores complementares da tabela de cores

METHOD Negative()  CLASS ZBITMAP
Local nI
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
Return

Por exemplo, a imagem negativa da bandeira do brasil fica assim:

bandeiraneg

Conclusão

Com mais alguns métodos, a classe ZBITMAP vai virar um “PaintBrush” em AdvPL 😀

Agradeço a todos pela audiência e lhes desejo TERABYTES DE SUCESSO !!! 

Referências

 

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

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