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:

Configuração dos forms de mais controles

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!