DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

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.

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você gostaria de comentar o que não lhe agradou?

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!


Joel Rodrigues
Técnico em Informática - IFRN Cursando Bacharelado em Ciências e Tecnologia - UFRN Programador .NET/C# e Delphi há mais de 3 anos, já tendo trabalhado com Webservices, WPF, Windows Phone 7 e ASP.NET, possui ainda conhecimentos em HTML, CSS e Javascript (jQuery). Certificado como Microsoft Special...
O que você achou deste post?

    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03