Bonjour,
J'ai éctit l'algo suivant pour construire un masque sur un Bitmap identifiant les plages d'une couleur prédéfinie avec une certaine tolérance (une sorte de baguette magique) et pour en calculer la couleur moyenne.
la variable Row est définie comme grhRGBTripleArrayPtr telque
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 Nbr:=0; SigmaR:=0; SigmaG:=0; SigmaB:=0; Setlength(Mask.Bool,BMP.Width,BMP.Height); for j := 0 TO BMP.Height-1 DO begin Row := BMP.Scanline[j]; for i := 0 TO BMP.Width-1 DO begin Mask.Bool[i,j]:= ((Row[i].rgbtRed<=RSup) and (Row[i].rgbtRed>=RInf)) and ((Row[i].rgbtGreen<=GSup) and (Row[i].rgbtGreen>=GInf)) and ((Row[i].rgbtBlue<=BSup) and (Row[i].rgbtBlue>=BInf)); if Mask.Bool[i,j] then begin inc(Nbr); SigmaR:= SigmaR+Row[i].rgbtRed; SigmaG:= SigmaG+Row[i].rgbtGreen; SigmaB:= SigmaB+Row[i].rgbtBlue; end else BMP.Canvas.Pixels[i,j]:= clMask; end end; if Nbr=0 then exit; SigmaR:= SigmaR div Nbr; SigmaG:= SigmaG div Nbr; SigmaB:= SigmaB div Nbr; Mask.AverageColor:= RGB(SigmaR,SigmaG,SigmaB);
Le problème est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // For pf24bit Scanlines grhRGBTripleArrayPtr = ^grhRGBTripleArray; grhRGBTripleArray = array[0..MaxPixelCount-1] of TRGBTriple;
Cet algo fonctionne parfaitement dans le projet 1 que j'ai écrit pour sa mise au point mais il ne fonctionne plus dans le projet 2 auquel je le destinais.
Dans le projet 2 le compilateur déclanche une violation d'accès dès la valeur i=1 à la ligne ou il initialise MaskBool en valeur. Au pas à pas j'ai observé à la valeur i=0 que les valeurs de type Row[i].rgbtRed sont initialisées et lisibles sous l'EDI et ne le sont plus à la valeur i=1 et sont illisibles sous l'EDI d'où sans doute l'origine de l'erreur.
Une différence importante entre les projets, qui est sans doute à l'origine de ce problème, c'est que le projet 1 travaille sur le bitmap d'une image chargée dans un Timage par la fonction Image.Picture.LoadFromFile(Opendialog1.Filename); dans laquelle le fichier image chargé possède l'extension BMP alors que le projet 2 travaille sur un bimap qui provient d'une fonction Canvas.CopyRect sur un Timage à l'origine chargée sur un fichier JPEG. j'ai cependant pris la précaution d'affecter le format pf24bit aux Bitmaps utilisées.
Quelqu'un comprend-il ce qui se produit ? auquel cas comment corriger le problème ?
Partager