Bonjour,
il me semblait l'avoir lu quelque part, je me suis dit que ça avait peut-être un rapport avec cette histoire de fichier 32bitsKC qui, mine de rien, fait 250 de large et donc pas divisible par 8.
Le truc que je ne m'explique pas, c'est que ce fichier 32bitsKC ce n'est pas moi qui le génère, ni mon code, je me contente juste de demander gentiment à Lazarus de l'ouvrir. Bah, l'explication est tout en bas, lire le PS.
Concernant le test rapide ci-dessous, le bouton "Enregistrer..." crée deux fichiers à chaque fois, l'un issu du bitmap de travail et l'autre du TImage d'affichage, les deux sont parfaits et examinés à l'éditeur hexa montrent un PixelFormat à 32.
Image réduite de moitié
Il n'y a rien de plus à dire, juste regarder le gif (qui m'a pourri le joli dégradé gris, )
Quand je pense au temps que j'ai passé, depuis des années, à chercher des bugs dans mes codes alors qu'il n'y en avait pas...
Cœur du code :
PS : je retrouve un peu le même défaut en utilisant un programme écrit en Delphi5 (source, adaptée juste ce qu'il faut) qui ne peut correctement afficher que les fichiers dont la largeur est divisible par 8.
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 procedure TForm1.ComputeBitmap; var h, w: integer; gray: integer;// ne pas utiliser byte ratio:single; {$IFDEF WINDOWS} row: pRGBTriple; {$ELSE} row: pRGBQuad; {$ENDIF} begin ratio:= 255 / (WSIZE + HSIZE); bmp.BeginUpdate(); for h := 0 to HSIZE-1 do begin {$IFDEF WINDOWS} row := pRGBTriple(bmp.RawImage.GetLineStart(h)); {$ELSE} // devrait s'appeler pRGBAQuad... row := pRGBQuad(bmp.RawImage.GetLineStart(h)); {$ENDIF} for w := 0 to WSIZE-1 do begin gray := round((h+w) * ratio); // calcul du gris if gray > 255 then gray := 255; {$IFDEF WINDOWS} {if bmp.PixelFormat = pf32bit then row[w] := RGBtoRGBTriple(gray, gray, gray) else } row[w] := RGBtoRGBTriple(gray, gray, gray) {$ELSE} if bmp.PixelFormat = pf32bit then row[w] := RGBAtoQuadBGRA(gray, gray, gray, 255) else row[w] := RGBAtoQuadRGBA(gray, gray, gray, 255) {$ENDIF} end; end; bmp.EndUpdate(); img.Picture.Graphic := bmp; end; procedure TForm1.FormCreate(Sender: TObject); begin HSIZE := 200; WSIZE := StrToInt(rdgLargeur.Items[rdgLargeur.ItemIndex]); bmp := TBitmap.Create; rdgPFClick(nil); end; procedure TForm1.rdgPFClick(Sender: TObject); begin with bmp do begin case rdgPF.ItemIndex of 0: PixelFormat := pf24bit; 1: PixelFormat := pf32bit; end; Height := HSIZE; Width := WSIZE; end; end; procedure TForm1.rdgLargeurClick(Sender: TObject); begin WSIZE := StrToInt(rdgLargeur.Items[rdgLargeur.ItemIndex]); bmp.Width := WSIZE; img.Width := WSIZE; ComputeBitmap; end;
Le même problème de rayures verticales est également visible avec la fenêtre de preview de l'OpenPictureDialog.
Et comme je n'ai jamais mis mes mains dans le code de l'opd, le bug n'est donc bien pas de mon fait.
Ce qui est curieux, c'est que 37 n'est pas divisible par 8 mais sa preview est correcte,
pas plus que 3 dont la preview est aussi correcte
ou 397x299, preview correcte
mais 397x1 preview vide !
Bon,je vais préparer un zip...deux dossiers et quelques fichiers : 2projets4div8.zip
Partager