Hello, it's me again -- désolé.

Je ne voulais pas vous embêter si vite mais franchement, il y a des jours on se demande...

Suite à mes récents déboires avec des images transparentes qui ne devraient pas l'être, je me suis mis en tête de bricoler vite fait un petit outil pour comparer des fichiers.
En même temps je me proposais de tester l'astuce que m'a passée anapurna concernant Scanline, mais on verra ça après, parce que d'entrée ça part mal.

Est-ce que vous voyez un défaut à cet algo (le premier fichier est parfaitement bien chargé par ailleurs, ça, ça concerne le second fichier et la comparaison) ?
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
procedure TForm1.Button2Click(Sender: TObject);
var
  pic: TPicture;
  p1,p2: pRGBQuad;
  h,w: integer;
begin
  if not opd.Execute then exit;
  pic := TPicture.Create;
  try
    pic.LoadFromFile(opd.Filename); // chargement du fichier
    imgDisplay.Picture.Bitmap.BeginUpdate;
    // parcours vertical
//    for h := 0 to imgDisplay.Picture.Bitmap.Canvas.Height-1 do begin
//    for h := 0 to imgDisplay.Picture.Bitmap.Height-1 do begin
    for h := 0 to imgDisplay.Height-1 do begin
//      p1 := pRGBQuad(imgDisplay.Picture.Bitmap.ScanLine[h]);
//      p2 := pRGBQuad(pic.Bitmap.Scanline[h]);
// dessus en attente que ça fonctionne dessous
      p1 := pRGBQuad(imgDisplay.Picture.Bitmap.RawImage.GetLineStart(h));;// source
      p2 := pRGBQuad(pic.Bitmap.RawImage.GetLineStart(h));// second fichier
      // parcours horizontal
//      for w := 0 to imgDisplay.Picture.Bitmap.Canvas.Width-1 do begin
//      for w := 0 to imgDisplay.Picture.Bitmap.Width-1 do begin
      for w := 0 to imgDisplay.Width-1 do begin
        if pRGBQuad(p1[w]) <> pRGBQuad(p2[w]) then begin // test et action si différence
          // 2 lignes pour voir la vie des choses
          memo1.Lines.Add(inttostr(h)+' '+inttostr(w));// de 299 303 à 299 399 -- le fic de test fait 400 x 300
          Application.ProcessMessages;
// obligé de mettre ces 4 lignes en commentaire sinon SIGSEGV en fin de boucle
{          p1[w].rgbBlue :=0;
          p1[w].rgbGreen:=0;
          p1[w].rgbRed  :=255;
          p1[w].rgbReserved:=255;   }
        end; // test
      end; // for w
    end; // for h
    imgDisplay.Picture.Bitmap.EndUpdate;
  finally
    pic.Free;
  end;
end;
Vous noterez que j'ai fait trois tentatives de balayage, avec toujours le même résultat, SIGSEGV

Et maintenant le truc qui tue, indépendamment de l'AV en fin de boucle : pour tester, avant de m'embarquer avec des fichiers dont je ne sais pas où sont les différences et s'il y en a, je teste en ouvrant deux fois le même fichier, et j'ai des lignes logguées dans le mémo !

Mais comment c'est possible un cauchemar pareil ?

Ah, tiens, si quelqu'un veut essayer rapidement, un TOpenPictureDialog, un TImage alClient dans un TPanel avec Color à clWhite et ça roule :
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
procedure TForm1.OpenImage(Filename: string);
var
  pic: TPicture;
begin
  pic := TPicture.Create;
  pic.Bitmap.Transparent:=False;
  try
    pic.LoadFromFile(Filename);
    if (pic.Width <> pnl4img.Width) or (pic.Height <> pnl4img.Height) then begin
      pnl4img.Width  := pic.Width;
      pnl4img.Height := pic.Height;
    end;
    imgDisplay.Picture.Assign(pic);
  finally
    pic.Free;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if opd.Execute then OpenImage(opd.FileName);
  Button2.SetFocus;
end;