Como aplicar um filtro de cor no componente TImage?

Delphi

01/09/2023

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

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

01/09/2023

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
GOSTEI 0
Alisson

Alisson

01/09/2023

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/
GOSTEI 0
Alisson

Alisson

01/09/2023

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/
GOSTEI 0
POSTAR