Salut
Je suis toujours sur le logiciel de dessin, et je suis en train de modifier le programme pour passer de la propriété Pixels[X,Y] a ScanLine.
J'essaye d'augmenter la luminosité d'une image, voici les procedures !
... avec ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 type PRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = array [Byte] of TRGBTriple; function AjusterLumImage(I :TBitmap; Correction: Integer):TBitmap; var X, Y :integer; Ligne : pRGBTripleArray; //Scanline IModif :TBitmap; begin IModif:=TBitmap.Create; IModif.Assign(I); IModif.PixelFormat := pf24bit; for Y:=0 to I.Height-1 do begin Ligne:=IModif.ScanLine[Y]; for X:=0 to I.Width-1 do Ligne[X]:=AjusterLumPixel(Ligne[X],Correction); end; AjusterLumImage:=IModif; IModif.Free; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function AjusterLumPixel(RVB :TrgbTriple; Correction :integer):TrgbTriple; var T,S,L :Byte; Resultat :TrgbTriple; Correc :real; begin RVBToTSL(RVB.rgbtRed, RVB.rgbtGreen, RVB.rgbtBlue, T, S, L); Correc:=0; if Correction>1 then Correc:=Correction/3; if Correction<-1 then Correc:=1/(-Correction/3); if L>0 then L:=Trunc(Int(Power((L/240),Correc)*240)) else L:=0; TSLToRVB(T, S, L, Resultat.rgbtRed, Resultat.rgbtGreen, Resultat.rgbtBlue); AjusterLumPixel:=Resultat; end;
Et les deux procedures de conversion :
Ce code me génere une erreur ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure RVBToTSL (const Rouge, Vert, Bleu :Byte; var Teinte, Sat, Lum :Byte); var Max, Min, Delta :Byte; T0 :Real; begin Max:=Rouge ; if Max<Vert then Max:=Vert; if Max<Bleu then Max:=Bleu; Min:=Rouge ; if Min>Vert then Min:=Vert; if Min>Bleu then Min:=Bleu; Delta:=Max-Min; T0:=0; if Delta<>0 then begin if Max=Rouge then T0:=(Vert-Bleu)/Delta; if Max=Vert then T0:=(Bleu-Rouge )/Delta+2; if Max=Bleu then T0:=(Rouge-Vert)/Delta+4; end; Teinte:=(Trunc(Int(T0*60)) mod 300)*2 div 3; if (((Max+Min)<>0) and ((Max+Min)<255)) or ((Max+Min)=510) then Sat:=(Delta*240) div (Max+Min) else Sat:=(Delta*240) div (510-Max-Min); Lum:=((Max+Min)*240) div 510; end; procedure TSLToRVB (const Teinte, Sat, Lum : Byte; var Rouge, Vert, Bleu :Byte); var Max, Min, Delta, T0 :Real; begin T0:=(6*Teinte)/240; if Lum<120 then begin Max:=255*Lum*(240+Sat) div (240*240); Min:=255*Lum*(240-Sat) div (240*240); end else begin Max:=255*(Lum*(240-Sat)+Sat*240) div(240*240); Min:=255*(Lum*(240+Sat)-Sat*240) div(240*240); end; Delta:=Max-Min; Rouge:=0; Vert:=0; Bleu:=0; case Trunc(T0) of 0 : begin Rouge:=Trunc(Int(Max)); Vert:=Trunc(Int(Min+(T0*Delta))); Bleu:=Trunc(Int(Min)); end; 1 : begin Rouge:=Trunc(Int(Min+(2-T0)*Delta)); Vert:=Trunc(Int(Max)); Bleu:=Trunc(Int(Min)); end; 2 : begin Rouge:=Trunc(Int(Min)); Vert:=Trunc(Int(Max)); Bleu:=Trunc(Int(Min+(T0-2)*Delta)); end; 3 : begin Rouge:=Trunc(Int(Min)); Vert:=Trunc(Int(Min+(4-T0)*Delta)); Bleu:=Trunc(Int(Max)); end; 4 : begin Rouge:=Trunc(Int(Min+(T0-4)*Delta)); Vert:=Trunc(Int(Min)); Bleu:=Trunc(Int(Max)); end; 5 : begin Rouge:=Trunc(Int(Max)); Vert:=Trunc(Int(Min)); Bleu:=Trunc(Int(Min+(6-T0)*Delta)); end; end;
---------------------------
Notification des exceptions du débogueur
---------------------------
Le projet Editeur.exe a déclenché la classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 00000000. Lecture de l'adresse 00000000'.
---------------------------
Si quelqu'un a une solution ... Je précise que quand je travaillais avec Pixels, j'avais presque les memes procedures, et ca marchait tres bien !
Ca fait un moment que je cherche, en vain. J'ai trouvé plein d'exemples, mais ca ne marche toujours pas !
Partager