balgrim
Messages postés52Date d'inscriptionvendredi 26 avril 2002StatutMembreDernière intervention28 octobre 2003
-
17 nov. 2002 à 20:34
cs_BLG
Messages postés16Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention29 décembre 2004
-
6 juin 2004 à 20:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_BLG
Messages postés16Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention29 décembre 2004 6 juin 2004 à 20:12
Voilà la procédure corrigée et optimisée qui fonctionne à présent à merveille !
Une unité à ajouter : Math.
Remarques :
- j'ai inversé X et Y pour que X corresponde à la colonne et non à la ligne de pixels du bitmap à modifier.
- j'ai ajouté un contrôle des variables de boucle "for" pour que le programme ne plante plus lorsque les X et Y entrés sont "trop près du bord" et que le programme cherche en conséquence à modifier des pixels hors de l'image.
procedure MakeLight(X, Y : Integer; D : Byte ; Bmp : TBitmap);
var
I, J, Adding : Integer;
P : pRGBTripleArray;
begin
D := D div 2;
for j := max(0, Y-D) to min(Y+D, bmp.Height-1) do begin
P := bmp.ScanLine[j];
for i := max(0, X-D) to min(X+D, bmp.Width-1) do begin
adding := 255 - min(trunc(255*(sqrt(sqr(i-X)+sqr(j-Y))/D)),255);
P[i].rgbtRed := min(255, P[i].rgbtRed + adding);
P[i].rgbtGreen := min(255, P[i].rgbtGreen + adding);
P[i].rgbtBlue := min(255, P[i].rgbtBlue + adding);
end;
end;
end;
cs_BLG
Messages postés16Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention29 décembre 2004 4 juin 2004 à 11:52
Voilà la procédure corrigée qui fonctionne à présent à merveille :
Une unité à ajouter : Math.
procedure MakeLight(X, Y : Integer; Intensity : Byte ; Bmp : TBitmap);
var
I, J, Adding : integer;
RowOriginal : pRGBTripleArray;
begin
for I:= max(0, X-(Intensity div 2)) to min(X+(Intensity div 2), bmp.Height-1) do begin
RowOriginal:=bmp.ScanLine[I];
for J:= max(0, Y-(Intensity div 2)) to min(Y+(Intensity div 2), bmp.Width-1) do begin
adding := 255 - min(trunc(255*(sqrt(sqr(I-X)+sqr(J-Y))/(Intensity div 2))),255);
if RowOriginal[J].rgbtRed+adding > 255 then
RowOriginal[J].rgbtRed:=255 else
inc(RowOriginal[J].rgbtRed,adding);
if RowOriginal[J].rgbtGreen+adding > 255 then
RowOriginal[J].rgbtGreen:=255 else
inc(RowOriginal[J].rgbtGreen,adding);
if RowOriginal[J].rgbtBlue+adding > 255 then
RowOriginal[J].rgbtBlue:=255 else
inc(RowOriginal[J].rgbtBlue,adding);
end;
end;
end;
balgrim
Messages postés52Date d'inscriptionvendredi 26 avril 2002StatutMembreDernière intervention28 octobre 2003 17 nov. 2002 à 20:34
heu... le bitmap doi tetre au pixelformat:=pf24bit;
voila, bye.
6 juin 2004 à 20:12
Une unité à ajouter : Math.
Remarques :
- j'ai inversé X et Y pour que X corresponde à la colonne et non à la ligne de pixels du bitmap à modifier.
- j'ai ajouté un contrôle des variables de boucle "for" pour que le programme ne plante plus lorsque les X et Y entrés sont "trop près du bord" et que le programme cherche en conséquence à modifier des pixels hors de l'image.
procedure MakeLight(X, Y : Integer; D : Byte ; Bmp : TBitmap);
var
I, J, Adding : Integer;
P : pRGBTripleArray;
begin
D := D div 2;
for j := max(0, Y-D) to min(Y+D, bmp.Height-1) do begin
P := bmp.ScanLine[j];
for i := max(0, X-D) to min(X+D, bmp.Width-1) do begin
adding := 255 - min(trunc(255*(sqrt(sqr(i-X)+sqr(j-Y))/D)),255);
P[i].rgbtRed := min(255, P[i].rgbtRed + adding);
P[i].rgbtGreen := min(255, P[i].rgbtGreen + adding);
P[i].rgbtBlue := min(255, P[i].rgbtBlue + adding);
end;
end;
end;
4 juin 2004 à 11:52
Une unité à ajouter : Math.
procedure MakeLight(X, Y : Integer; Intensity : Byte ; Bmp : TBitmap);
var
I, J, Adding : integer;
RowOriginal : pRGBTripleArray;
begin
for I:= max(0, X-(Intensity div 2)) to min(X+(Intensity div 2), bmp.Height-1) do begin
RowOriginal:=bmp.ScanLine[I];
for J:= max(0, Y-(Intensity div 2)) to min(Y+(Intensity div 2), bmp.Width-1) do begin
adding := 255 - min(trunc(255*(sqrt(sqr(I-X)+sqr(J-Y))/(Intensity div 2))),255);
if RowOriginal[J].rgbtRed+adding > 255 then
RowOriginal[J].rgbtRed:=255 else
inc(RowOriginal[J].rgbtRed,adding);
if RowOriginal[J].rgbtGreen+adding > 255 then
RowOriginal[J].rgbtGreen:=255 else
inc(RowOriginal[J].rgbtGreen,adding);
if RowOriginal[J].rgbtBlue+adding > 255 then
RowOriginal[J].rgbtBlue:=255 else
inc(RowOriginal[J].rgbtBlue,adding);
end;
end;
end;
17 nov. 2002 à 20:34
voila, bye.