Como aplicar um filtro de cor no componente TImage?

01/09/2023

0

Estou tentando criar uma aplicação onde são criadas varias imagens igual, uma ao lado da outra, cada um com uma tag.


Queria informar em um edit qual dessas imagens eu quero pintar e de qual cor pintar, porem não venho obtendo sucesso.



Pelos testes que fiz da um erro dizendo que só posso acessar imagens que tenham um BitMap, porem a extensão da imagem é BMP, alguém sabe fazer algo parecido com oq eu quero?
Guilherme Lima

Guilherme Lima

Responder

Posts

01/09/2023

Arthur Heinrich

Alguns tipos de imagem podem não preencher o buffer, como um um TBitmap. Nestes casos, você precisa primeiro transformar a sua imagem em um bitmap.

var
  Picture : TPicture;
  BM : TBitmap;
begin
  Picture:=TPicture.Create;
  // Leitura da imagem original
  Picture.LoadFromFile(Source);
  // Conversão para Bitmap
  BM:=TBitmap.Create;
  BM.PixelFormat:=pf32Bit;
  BM.Width:=Picture.Width;
  BM.Height:=Picture.Height;
  BM.Canvas.Draw(0,0,Picture.Graphic);
  // Neste ponto você tem um bitmap e pode acessar os dados de cada pixel, através da propriedade ScanLine[linha]
end;


A propriedade ScanLine[linha] retorna um ponteiro para o primeiro byte da linha. Utilizando PixelFormat pf32bit, a cada 4 bytes você terá um píxel, sendo cada byte a intensidade de cada componente de cor: Blue, Green, Red e Alpha
Responder

01/09/2023

Alisson

Estou tentando criar uma aplicação onde são criadas varias imagens igual, uma ao lado da outra, cada um com uma tag.


Queria informar em um edit qual dessas imagens eu quero pintar e de qual cor pintar, porem não venho obtendo sucesso.



Pelos testes que fiz da um erro dizendo que só posso acessar imagens que tenham um BitMap, porem a extensão da imagem é BMP, alguém sabe fazer algo parecido com oq eu quero?


uses
SysUtils, Classes, Graphics, ExtCtrls, JPEG;

procedure ApplyColorFilter(Image: TImage; RedFactor, GreenFactor, BlueFactor: Single);
var
Bitmap: TBitmap;
X, Y: Integer;
R, G, B: Byte;
begin
if (Image.Picture.Graphic = nil) or not (Image.Picture.Graphic is TBitmap) then
Exit;

Bitmap := TBitmap.Create;
try
Bitmap.Assign(Image.Picture.Graphic);
for X := 0 to Bitmap.Width - 1 do
begin
for Y := 0 to Bitmap.Height - 1 do
begin
// Obtém o valor dos componentes de cor (R, G, B) do pixel
R := GetRValue(Bitmap.Canvas.Pixels[X, Y]);
G := GetGValue(Bitmap.Canvas.Pixels[X, Y]);
B := GetBValue(Bitmap.Canvas.Pixels[X, Y]);

// Aplica o filtro de cor multiplicando os valores dos componentes de cor pelos fatores
R := Round(R * RedFactor);
G := Round(G * GreenFactor);
B := Round(B * BlueFactor);

// Define a cor modificada no pixel
Bitmap.Canvas.Pixels[X, Y] := RGB(R, G, B);
end;
end;

// Atualiza o componente TImage com a imagem filtrada
Image.Picture.Bitmap.Assign(Bitmap);
finally
Bitmap.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Aplica um filtro vermelho (aumentando o canal vermelho)
ApplyColorFilter(Image1, 2.0, 0.5, 0.5);
end;
Fonte: blog.tyttosoft.com.br/
Responder

01/09/2023

Alisson

Estou tentando criar uma aplicação onde são criadas varias imagens igual, uma ao lado da outra, cada um com uma tag.


Queria informar em um edit qual dessas imagens eu quero pintar e de qual cor pintar, porem não venho obtendo sucesso.



Pelos testes que fiz da um erro dizendo que só posso acessar imagens que tenham um BitMap, porem a extensão da imagem é BMP, alguém sabe fazer algo parecido com oq eu quero?


uses
SysUtils, Classes, Graphics, ExtCtrls, JPEG;

procedure ApplyColorFilter(Image: TImage; RedFactor, GreenFactor, BlueFactor: Single);
var
Bitmap: TBitmap;
X, Y: Integer;
R, G, B: Byte;
begin
if (Image.Picture.Graphic = nil) or not (Image.Picture.Graphic is TBitmap) then
Exit;

Bitmap := TBitmap.Create;
try
Bitmap.Assign(Image.Picture.Graphic);
for X := 0 to Bitmap.Width - 1 do
begin
for Y := 0 to Bitmap.Height - 1 do
begin
// Obtém o valor dos componentes de cor (R, G, B) do pixel
R := GetRValue(Bitmap.Canvas.Pixels[X, Y]);
G := GetGValue(Bitmap.Canvas.Pixels[X, Y]);
B := GetBValue(Bitmap.Canvas.Pixels[X, Y]);

// Aplica o filtro de cor multiplicando os valores dos componentes de cor pelos fatores
R := Round(R * RedFactor);
G := Round(G * GreenFactor);
B := Round(B * BlueFactor);

// Define a cor modificada no pixel
Bitmap.Canvas.Pixels[X, Y] := RGB(R, G, B);
end;
end;

// Atualiza o componente TImage com a imagem filtrada
Image.Picture.Bitmap.Assign(Bitmap);
finally
Bitmap.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Aplica um filtro vermelho (aumentando o canal vermelho)
ApplyColorFilter(Image1, 2.0, 0.5, 0.5);
end;
Fonte: blog.tyttosoft.com.br/
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar