Parce qu'on croit lire systématiquement 4 octets !
Regarde :
1er pixel différent entre l'original (en haut) et le modifié (avec le M rouge et la souris dessus, pour que la loupe fasse son office).
Regarde bien le mémo 3e colonne : c'est l'original, et le carré noir dans la loupe montre où je "pipette" la couleur, 1 pixel à gauche du rouge (ça n'aurait présenté aucun intérêt d'être dessus) et 4e colonne c'est integer(p2^) où on voit bien les suites rouges (0 0 225, RGB inversé), on attaque en haut à gauche du M.
(1re colonne c'est h du balayage vertical, 2e colonne c'est w de l'horizontal).
Quant au bleu dans l'original, il fluctue un poil 201 dans la loupe mais pas dans le mémo, puis 202 ... 203 ... 202, les deux autres sont stables (217 222)
Si on regarde bien, on a l'impression que le carré noir de la loupe est presque à la même distance du bord gauche et du bord haut, presque, hein, à peine un poil plus court en largeur, or le mémo dit 22 et 57.
Oui ! Parce que 57 / 3 = 19 et 19 c'est presque 22.
22 c'est la ligne de pixels, et 57 c'est le byte dans la ligne en cours d'analyse, pas le pixel. Si on parlait en colonnes, on dirait 22 (de haut) 19 (depuis le bord), ce qui correspond à la grande image (pas la loupe, qui ne montre pas les bords, méfiance !)
Elle est fausse ? Elle me va très bien, je peux comparer les octets, je pourrai choper l'alpha, bientôt !
Et le plus fou, donc, c'est que si je teste avec deux fichiers 32 bits, le résultat dans le mémo est le même ! Pas de copie d'écran, croyez-moi sur parole, merci.
J'ai même rajouté, tout en fin de boucle,400 parce que mes fichiers font 400 px de large sur 300 lignes de haut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 inc(h); end; memo1.lines.Add(inttostr(h)+' '+inttostr(w)); // 300 1199 avec fic 24 (1199 = 400x3 -1)
Et lol de lol, j'ai les deux mêmes valeurs avec mon fichier 32 bits, or à aucun moment je n'interviens sur ces paramètres ! Au contraire même, la proc appelante force le bmp.PixelFormat en fonction du BitmapInfoHeader (et j'ai vérifié à coups de ShowMessage, c'est good).
La seule intervention qui peut mettre sa pagaille, c'est les bmp.Scanline[h], je ne vois que ça...
J'ai lu à la va-vite (suis pressé c't'aprème...), j'ai cru à une histoire de padding, désolé.
Partager