1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| Function ColorToR (pix:Tcolor):Tcolor;
begin
Result:=(pix)and($000000FF);
end;
Function ColortoV (pix:Tcolor):tcolor;
begin
result:=(pix)and($0000FF00);
end;
Function ColortoB (pix:Tcolor):Tcolor;
begin
result:=(pix)and($00FF0000);
end;
type
Tretenu = array[1..16] of Tcolor;
Tselectrouge= array[1..16] of Tcolor;
Tselectvert= array[1..16] of Tcolor;
Tselectbleu= array[1..16] of Tcolor;
Tpix = array[1..16] of Tcolor;
var
x,y,p1,p2,p3,ok:integer;
a,b:extended;
marge:integer;
compteur:integer;
selectr: Tselectrouge;
selectb: Tselectbleu;
selectv: Tselectvert;
retenu: Tretenu;
pix: Tpix;
begin
pix[1]:=blanc.Canvas.Pixels[1,1];
pix[2]:=grisclair.Canvas.Pixels[1,1];
pix[3]:=grisfonce.Canvas.Pixels[1,1];
pix[4]:=noir.Canvas.Pixels[1,1];
pix[5]:=bleu.Canvas.Pixels[1,1];
pix[6]:=bleuclair.Canvas.Pixels[1,1];
pix[7]:=bleufonce.Canvas.Pixels[1,1];
pix[8]:=vertclair.Canvas.Pixels[1,1];
pix[9]:=vertfonce.Canvas.Pixels[1,1];
pix[10]:=violet.Canvas.Pixels[1,1];
pix[11]:=violetclair.Canvas.Pixels[1,1];
pix[12]:=rose.Canvas.Pixels[1,1];
pix[13]:=orange.Canvas.Pixels[1,1];
pix[14]:=jaune.Canvas.Pixels[1,1];
pix[15]:=rouge.Canvas.Pixels[1,1];
pix[16]:=marron.Canvas.Pixels[1,1];
marge:=127;
compteur:=0;
ok:=0;
For x:=1 to 500 do
begin
For y:=1 to 250 do
begin
while ok=0 do
begin {selections des pix qui ont le même niveau de rouge que le pixel[x,y] de l'image1 à une marge près}
a:=integer(colortor(image1.Canvas.Pixels[x,y]))+marge;
b:=integer(colortor(image1.Canvas.Pixels[x,y]))-marge;
If b<0 then b:=0;
If a>255 then a:=255;
For p1:=1 to 16 do
begin
If (integer(colortor(pix[p1]))<a) and (integer(colortor(pix[p1]))>b) then selectr[p1]:=pix[p1];
end;
a:=integer(colortov(image1.Canvas.Pixels[x,y]))+(marge*256); {selections des pix qui ont le même niveau de vert que le pixel[x,y] de l'image1 à une marge près}
b:=integer(colortov(image1.Canvas.Pixels[x,y]))-(marge*256);
If b<256 then b:=256;
If a>65280 then a:=65280;
For p2:=1 to 16 do
begin
If (integer(colortov(pix[p2]))<a) and (integer(colortov(pix[p2]))>b) then selectv[p2]:=pix[p2];
end;
a:=integer(colortob(image1.Canvas.Pixels[x,y]))+(marge*65536); {selections des pix qui ont le même niveau de bleu que le pixel[x,y] de l'image1 à une marge près}
b:=integer(colortob(image1.Canvas.Pixels[x,y]))-(marge*65536);
If b<65536 then b:=65536;
If a>16711680 then a:=16711680;
For p3:=1 to 16 do
begin
If (integer(colortob(pix[p3]))<a) and (integer(colortob(pix[p3]))>b) then selectb[p3]:=pix[p3];
end;
For p1:=1 to 16 do {on ne retient que les pix qui ont été sélectionné dans les trois niveaux, rouge vert et bleu}
begin
For p2:=1 to 16 do
begin
For p3:=1 to 16 do
begin
If (selectr[p1]=selectv[p2]) and (selectr[p1]=selectb[p3]) then
begin
compteur:=compteur+1;
retenu[compteur]:=selectr[p1];
end;
end;
end;
end;
If compteur=1 then ok:=1 else marge:=marge-1; { Tant qu'il ne reste pas plus qu'un pix, on recommence en diminuant la marge} end;
image2.Canvas.pixels[x,y]:=retenu[1];
end;
end;
end; |
Partager