1 pièce(s) jointe(s)
GetLineStart (équiv. ScanLine) : Access Violation sous Windows, pas sous Linux
Bonjour,
encore un truc à péter les plombs et à y passer des heures et des heures...
Je vous ai préparé une jolie copie d'écran d'un bout de code rodé et éprouvé sous Linux avec Laz 1.4 et qui me génère un Access Violation sous XP avec Laz 1.6 je vous raconte pas !
Enfin si, je vous explique :
Pièce jointe 222017
Ça se passe sur la ligne suivant celle en rouge, là où l'on trouve l'équivalent du ScanLine et qui d'habitude fonctionne du feu de Dieu mais cette fois, est-ce dû au fait que 2 lignes au-dessus je fais un autre "ScanLine" dans un autre Bitmap ?, toujours est-il que je me prends ligne 57 un AV qui fait peur, dans le sens où d'habitude sous Windows quand il n'y a qu'un seul GetLineStart il n'y a pas de souci (sinon je serais déjà venu pleurer ici, vous vous en doutez bien ;)), et surtout, surtout, ce code ne pose aucun problème sous Linux.
Qu'est-ce que je dois faire ? C'est vraiment désespérant car je suis bloqué de chez bloqué sur ça : je ne vois pas par quoi je pourrais remplacer un code qui fonctionne...
Ah, je réalise à l'instant que non, ce n'est pas une histoire d'imbrication, voilà avec quoi j'ai bien bossé hier sans aucun souci sous Linux, et qui me génère également un AV au bout d'une vingtaine d'entrées dans le TMemo de contrôle en fin de proc (ligne 40) sous Windows (on se demande, des fois, si on ne marche pas sur la tête :weird:) : il n'y a qu'un seul Bitmap, dans un premier temps je le remplis avec des couleurs aléatoires, et dans un second temps je relis ses pixels pour en extraire la valeur numérique et mettre ça dans un mémo (maquette de test pour un autre projet)
Code:
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
| const
IMAGE_WIDTH = 32;
IMAGE_HEIGHT = 32;
FUNCTION RGBAtoQuadBGRA(CONST red, green, blue, reserved: BYTE): TRGBQuad;
BEGIN
WITH RESULT DO BEGIN
rgbRed := red;
rgbGreen := green;
rgbBlue := blue;
rgbReserved := reserved;
END
END;
procedure TForm1.Button1Click(Sender: TObject);
var
h,w: Integer;
aBmp: TBitmap;
p: pRGBQuad; // need LCLtype
begin
DoubleBuffered := True;
image1.Picture := nil;
aBmp := TBitmap.Create;
with aBmp do begin
PixelFormat := pf24bit; // image OK
SetSize(IMAGE_WIDTH, IMAGE_HEIGHT);
BeginUpdate();
for h := 0 to IMAGE_HEIGHT-1 do begin
p := pRGBQuad(RawImage.GetLineStart(h));
for w := 0 to IMAGE_WIDTH-1 do
p[w] := RGBAtoQuadBGRA(h*8, w*8, (h+w) *4, 255);
end;
EndUpdate();
end;
image1.Picture.Assign(aBmp);
// relecture du bitmap
for h := 0 to IMAGE_HEIGHT-1 do begin
p := pRGBQuad(aBmp.RawImage.GetLineStart(h));
for w := 0 to IMAGE_WIDTH-1 do
memo1.Lines.Add(IntToStr(RGBtoColor(p[w].rgbRed,p[w].rgbGreen,p[w].rgbBlue)));
end;
aBmp.Free;
end; |
J'ai tout mis, vous pouvez tester, y a qu'à poser un TImage de 32x32 (ou autre, je vous laisse expérimenter mais pensez à adapter les 2 constantes), un TButton, copier/coller ce code et hop, roule ma poule !
Toutes les idées sont les bienvenues (Anapurna, tu crois que c'est encore un truc mal initialisé ? Mais ça fonctionne tip-top sous Linux, bon sang ! [hé oui, Jon, c'est comm' ça la vie :P])
EDIT : ah, j'ai essayé ça, mais c'est la même misère...
Code:
1 2 3 4 5 6 7 8 9
| for h := 0 to IMAGE_HEIGHT-1 do begin
{$IFDEF LINUX}
p := pRGBQuad(aBmp.RawImage.GetLineStart(h));
{$ELSE}
p := pRGBQuad(aBmp.ScanLine[h]);
{$ENDIF}
for w := 0 to IMAGE_WIDTH-1 do
memo1.Lines.Add(inttostr(RGBtoColor(p[w].rgbRed,p[w].rgbGreen,p[w].rgbBlue)));
end; |