Invertendo cores de uma imagem em Delphi

Veja neste artigo como utilizar o objeto canvas da classe TBitmap para inverter uma cor de um bitmap, trocando-a por uma qualquer.

O objetivo deste artigo é mostrar uma aplicação prática de uso do objeto Canvas da classe TBitmap no Delphi. Veremos como percorrer uma imagem (no formato bitmap) e inverter uma determinada cor, trocando por outra qualquer que desejarmos.

Inicialmente, adicionemos alguns controles ao form e o configuremos da seguinte forma:


Figura 1: Configuração dos forms de mais controles

Temos alguns TButton, dois TPanel que usaremos para exibir as cores selecionadas, um TImage, um TOpenDialog, TSaveDialog e um TColorDialog.

Partindo para a prática, trataremos o evento onClick dos botões na sequência em que aparecem.

Listagem 1: Evento onClick do botão btnCarregar

if OpenDialog1.Execute then Image1.Picture.LoadFromFile(OpenDialog1.FileName);

Listagem 2: Evento onClick do botão btnSalvar

if SaveDialog1.Execute then Image1.Picture.SaveToFile(SaveDialog1.FileName);

Os dois primeiros botões servem, respectivamente, para carregar uma imagem e salvá-la após a modificação. Em seguida veremos os códigos dos botões responsáveis pela seleção das cores que queremos inverter.

Listagem 3: Evento onClick do botão btnCorOriginal

if ColorDialog1.Execute then pnlCorOriginal.Color := ColorDialog1.Color;

Listagem 4: Evento onClick do botão btnNovaCor

if ColorDialog1.Execute then pnlNovaCor.Color := ColorDialog1.Color;

Ao clicarmos no botão btnInverter, a cor exibida no painel pnlCorOriginal será substituída, na imagem, pela cor pnlNovaCor. Vejamos então este código, que é o principal da nossa aplicação.

Listagem 5: Evento onClick do botão btnInverter

var i, j:integer; begin for i := 0 to imgFigura.Width do begin for j := 0 to imgFigura.Height do begin if imgFigura.Picture.Bitmap.Canvas.Pixels[i,j] = pnlCorOriginal.Color then imgFigura.Picture.Bitmap.Canvas.Pixels[i,j] := pnlNovaCor.Color; end; end;

O código em si é bastante simples, percorremos todos os pixels da imagem e, caso a cor do pixel seja a mesma do painel pnlCorOriginal, substituímos pela cor do painel pnlNovaCor.

Observação: o processo pode demorar um pouco, dependendo do tamanho da imagem.

Apenas incrementando nossa aplicação, vamos facilitar a seleção da cor original por parte do usuário. Permitiremos que ele clique sobre a imagem com o botão direito do mouse para selecionar a cor daquele ponto. Para isso, codificaremos o evento onMouseDown do imgFigura conforme a Listagem 6.

Listagem 6: Evento onMouseDown do TImage imgFigura

if Button = mbRight then pnlCorOriginal.Color := Image1.Picture.Bitmap.Canvas.Pixels[X, Y];

Bastante simples, não é verdade? Esta é apenas uma aplicação do objeto Canvas, seguindo o mesmo raciocínio poderíamos escrever uma rotina para deixar a imagem em tom de cinza, ou em preto e branco, por exemplo.

Observação: este processo só funciona para bitmaps.

Então é isso, espero que tenham gostado. Até a próxima!

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados