Bonsoir,
Ayant découvert le superbe projet (pas tout jeune mais certainement utile) reechantillonnage-bicubique-vs-stretchblt, je viens voir s'il y aurait par ici du... SAV, !
Car, oui, une des fonctions nous fait un petit caca nerveux en faisant sauter la ligne du bas et la dernière colonne à droite, je veux parler de StretchBmpAlpha3.
D'habitude je code en Lazarus, et c'est là que j'ai découvert le souci.
Pour en avoir le cœur net, j'ai lancé dans une machine virtuelle Win2000 mon vieux D7pe toujours vaillant, mais un poil plus chatouilleux, on va le voir + bas.
Commençons avec une première image animée, où l'on constate que si StretchbmpAlpha3 réduit l'image, StretchBlt & Halftone éclaircit les couleurs (si si, prenez un color picker et vous le verrez) :
Mais ce n'est pas pour moi le plus important : le souci c'est vraiment la géométrie et on le voit mieux là avec un agrandissement à 400 % ; j'ai forcé le gris qui entoure l'image dans le prog, on le voit bien en bas et à droite et il laisse donc apparaître les ligne et colonne en blanc :
Tout ça est confirmé par l'examen avec un éditeur hexa du fichier généré par l'outil, où l'on constate qu'après les 3 lignes et 1/2 du header le début des données (dernière ligne de l'image) est plein de blanc (FF 4 fois, il s'agit de 32 bits), ainsi que 4 colonnes à droite toute, en bas de l'éditeur (fin du fichier) où l'on voit le bout droit de la première ligne de l'image, contenant 16 FF (4 fois pour 1 pixel, et il y en a 4 puisque agrandissement à 400 %).
Les DF DF DF 00 qui précédent correspondent au carré gris (223 223 223) en haut à droite.
Ensuite je suis un peu allé voir le code, et pour comprendre j'ai rajouté un mémo et ça :
D'abord juste avant la ligne end; // if yo2 :
logtype1
on parcourt toute la hauteur sauf la dernière ligne de l'image (192x128), et on ne va pas au bout de la ligne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 with FrmDemoMain.Memo1.Lines do Add(its(yr)+'--'+its(yo1)+'--'+its(yo2)+'--'+its(xo1)+'--'+its(xr)); // première ligne 0-- 0-- 1-- 0-- 0 // dernière ligne 126--126--127--190--190
Avec Lazarus, si je modifie
if (yo2 < HS) and (xo2 < WS) then en
if (yo2 <= HS) and (xo2 <= WS) then alors je parcours toute l'image :
mais il y a des effets de bords (couleurs bizarres dans les dernières ligne et colonne) et plus grave, violation d'accès sous Delphi
Code : Sélectionner tout - Visualiser dans une fenêtre à part // si option "<=" dernière ligne = 127--127--128--191--191 on parcourt tout
logtype2
et c'est normal puisqu'on ne va pas au bout de la hauteur ni de la largeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 with FrmDemoMain.Memo1.Lines do if ((yr = 0) or (yr = hr-1)) and ((xr = 0) or (xr = wr-1)) then begin Add(its(yr)+'--'+its(xr)); Add(its(PRGBQuad(scanR)^.rgbBlue)); Add(its(PRGBQuad(scanR)^.rgbGreen)); Add(its(PRGBQuad(scanR)^.rgbRed)); Add(its(PRGBQuad(scanR)^.rgbReserved)); Add(''); end; // juste 0--0 / 128 128 0 0
si la mécanique logtype2 est déplacée après la ligne end; // if yo2, voilà les résultats :
Sous Lazarus, avec la manip étendant le parcours, le 3e pixel retrouve ses bonnes couleurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 000--000 / 128-128-000-0 vert-bleu ok 000--191 / 223-223-223-0 gris ok 127--000 / 022-085-220-0 orange FAUX ! 127--191 / 022-085-220-0 orange ok
Je peux étendre le parcours autrement :
sous Lazarus, mais Delphi nous fait encore un caprice de violation d'accès.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 //if (yo2 < HS) and (xo2 < WS) then // original, trop petit if (yo2 < HS+1) and (xo2 < WS+1) then // taille ok mais défauts bas + droite
Ah, its c'est juste ça (mais ça va tellement plus vite à taper, et le code est plus lisible, que du bonheur) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part function its(i:integer):string; begin result:=IntToStr(i); end;
C'est tout ce que je peux en dire pour le moment, ces parcours de pixels me dépassent un peu, je l'avoue.
Alors si quelqu'un a une idée, si les auteurs se reconnaissent et passent par là (il m'est arrivé d'en lire deux, des fois, ici), leurs conseils seront les bienvenus.
Merci,
Partager