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!