Como aplicar um filtro de cor no componente TImage?
01/09/2023
0
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
Posts
01/09/2023
Arthur Heinrich
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
01/09/2023
Alisson
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/
01/09/2023
Alisson
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/
Clique aqui para fazer login e interagir na Comunidade :)