Efeitos em Imagens
Eu gostaria de saber se é possivel aplicar pequenos efeitos em algumas imagens no delphi;
Como inverter as cores.
Efeito Preto e branco,inverter e mudar a tonalidade da imagem
Como inverter as cores.
Efeito Preto e branco,inverter e mudar a tonalidade da imagem
Arthur Scarpelli
Curtidas 0
Respostas
Joel Rodrigues
28/02/2012
Cara, vou te passar um algorítimo que fiz e testei para deixar a imagem em tom de cinza, mas aqui só deu certo com bitmaps.
Primeiramente vou tentar explicar o algorítmo:
um tom de cinza é uma cor onde as três componentes possuem valores iguais (R=G=B). Então varri toda a imagem (pixel a pixel), peguei os valores R, G e B de cada pixel e verifiquei qual o maior deles, passando para uma variável Tom. Encontrando o valor de Tom, definir que aquele pixel teria uma cor onde R=G=B=Tom, ou seja, RGB(Tom, Tom, Tom).
Agora o código:
---------------------------------------------------------
var
i, j:integer; //variáveis para loop
R, G, B:Integer; //valores Red, Green e Blue de cada pixel da imagem
Tom :Integer; //receberá o valor da maior componente (R, G ou B)
begin
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Width do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(Tom, Tom, Tom);
end;
end;
end;
---------------------------------------------------------
Sim, esse processo pode demorar, mas veja que o Delphi não é um editor de imagem. Esse algorítmo funciona, só acho que não vale a pena implementar em sua aplicação. Mas fia a seu critério.
Boa sorte.
Primeiramente vou tentar explicar o algorítmo:
um tom de cinza é uma cor onde as três componentes possuem valores iguais (R=G=B). Então varri toda a imagem (pixel a pixel), peguei os valores R, G e B de cada pixel e verifiquei qual o maior deles, passando para uma variável Tom. Encontrando o valor de Tom, definir que aquele pixel teria uma cor onde R=G=B=Tom, ou seja, RGB(Tom, Tom, Tom).
Agora o código:
---------------------------------------------------------
var
i, j:integer; //variáveis para loop
R, G, B:Integer; //valores Red, Green e Blue de cada pixel da imagem
Tom :Integer; //receberá o valor da maior componente (R, G ou B)
begin
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Width do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(Tom, Tom, Tom);
end;
end;
end;
---------------------------------------------------------
Sim, esse processo pode demorar, mas veja que o Delphi não é um editor de imagem. Esse algorítmo funciona, só acho que não vale a pena implementar em sua aplicação. Mas fia a seu critério.
Boa sorte.
GOSTEI 0
Joel Rodrigues
28/02/2012
Cara, vou te passar um algorítimo que fiz e testei para deixar a imagem em tom de cinza, mas aqui só deu certo com bitmaps.
Primeiramente vou tentar explicar o algorítmo:
um tom de cinza é uma cor onde as três componentes possuem valores iguais (R=G=B). Então varri toda a imagem (pixel a pixel), peguei os valores R, G e B de cada pixel e verifiquei qual o maior deles, passando para uma variável Tom. Encontrando o valor de Tom, definir que aquele pixel teria uma cor onde R=G=B=Tom, ou seja, RGB(Tom, Tom, Tom).
Agora o código:
---------------------------------------------------------
var
i, j:integer; //variáveis para loop
R, G, B:Integer; //valores Red, Green e Blue de cada pixel da imagem
Tom :Integer; //receberá o valor da maior componente (R, G ou B)
begin
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Width do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(Tom, Tom, Tom);
end;
end;
end;
---------------------------------------------------------
Sim, esse processo pode demorar, mas veja que o Delphi não é um editor de imagem. Esse algorítmo funciona, só acho que não vale a pena implementar em sua aplicação. Mas fia a seu critério.
Boa sorte.
Primeiramente vou tentar explicar o algorítmo:
um tom de cinza é uma cor onde as três componentes possuem valores iguais (R=G=B). Então varri toda a imagem (pixel a pixel), peguei os valores R, G e B de cada pixel e verifiquei qual o maior deles, passando para uma variável Tom. Encontrando o valor de Tom, definir que aquele pixel teria uma cor onde R=G=B=Tom, ou seja, RGB(Tom, Tom, Tom).
Agora o código:
---------------------------------------------------------
var
i, j:integer; //variáveis para loop
R, G, B:Integer; //valores Red, Green e Blue de cada pixel da imagem
Tom :Integer; //receberá o valor da maior componente (R, G ou B)
begin
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Width do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(Tom, Tom, Tom);
end;
end;
end;
---------------------------------------------------------
Sim, esse processo pode demorar, mas veja que o Delphi não é um editor de imagem. Esse algorítmo funciona, só acho que não vale a pena implementar em sua aplicação. Mas fia a seu critério.
Boa sorte.
GOSTEI 0
Joel Rodrigues
28/02/2012
Outro algorítmo (melhor qualidade):
var
i, j:integer;
R, G, B:Integer;
Lum:Integer;
begin
Self.DoubleBuffered := True;
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Height do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
Lum := Round(R*0.3 + G*0.59 + B*0.11);
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(Lum, Lum, Lum);
end;
end;
var
i, j:integer;
R, G, B:Integer;
Lum:Integer;
begin
Self.DoubleBuffered := True;
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Height do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
Lum := Round(R*0.3 + G*0.59 + B*0.11);
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(Lum, Lum, Lum);
end;
end;
GOSTEI 0
Joel Rodrigues
28/02/2012
Mais um algorítimo, este é para deixar preto e branco.
var
i, j:integer;
R, G, B:Integer;
Tom :Integer;
maior, med:Integer;
begin
Self.DoubleBuffered := True;
maior := 0;
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Height do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
if Tom > maior then
maior := Tom;
end;
end;
med := Round(maior/2);
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Height do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
if Tom < med then
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(255, 255, 255)
else
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(0, 0, 0);
end;
end
end;
var
i, j:integer;
R, G, B:Integer;
Tom :Integer;
maior, med:Integer;
begin
Self.DoubleBuffered := True;
maior := 0;
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Height do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
if Tom > maior then
maior := Tom;
end;
end;
med := Round(maior/2);
for i := 0 to Image1.Width do
begin
for j := 0 to Image1.Height do
begin
R := GetRValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
G := GetGValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
B := GetBValue(ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[i,j]));
if R > G then
begin
if R > B then
Tom := R
else
Tom := B;
end
else
begin
if G > B then
Tom := G
else
Tom := B;
end;
if Tom < med then
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(255, 255, 255)
else
Image1.Picture.Bitmap.Canvas.Pixels[i,j] := RGB(0, 0, 0);
end;
end
end;
GOSTEI 0
Arthur Scarpelli
28/02/2012
Não consegui fazer funcionar quando eu coloco o seu algorítimo no evento click de um Button a imagem simplesmente some
GOSTEI 0
Joel Rodrigues
28/02/2012
A imagem é BITMAP (.BMP)? Isso ocorreu aqui quando eu usava uma imagem em outro formato.
GOSTEI 0
Deivison Melo
28/02/2012
Verifique o componente (free): ImageEn (versão atual: 3.1.1 (ImageEn 3.1.1)).
Pode baixe ele através do site:
http://www.torry.net/quicksearchd.php?String=ImageEn+&Title=Yes
Pode baixe ele através do site:
http://www.torry.net/quicksearchd.php?String=ImageEn+&Title=Yes
GOSTEI 0
Joel Rodrigues
28/02/2012
Pronto, se esse componente fizer o que você precisa e você não se opuser ao uso, é bem melhor que ficar usando esses algorítmos que mostre. Como falei, não acho viável aplicá-los, mas mostrei como funciona o processo.
GOSTEI 0
Arthur Scarpelli
28/02/2012
Obrigado pela ajuda
GOSTEI 0
Joao Silva
28/02/2012
ola galera, gostei muito dos exemplos dado aqui, os tres ultimos sao mais rapidos do q o primeiro exemplo!!!.
mas so funciona com bitmaps.
mas so funciona com bitmaps.
GOSTEI 0