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 !

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;
... 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
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 :

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;
Ce code me génere une erreur ...

---------------------------
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 !