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) ?
Vous noterez que j'ai fait trois tentatives de balayage, avec toujours le même résultat, SIGSEGV
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;
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;
Partager