REDIMENSIONNEMENT XBR AVEC DES FACTEURS D'ÉCHELLE QUELCONQUES

amiga68 Messages postés 54 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 21 décembre 2009 - 28 oct. 2012 à 22:09
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 - 3 nov. 2012 à 14:46
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54693-redimensionnement-xbr-avec-des-facteurs-d-echelle-quelconques

cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
3 nov. 2012 à 14:46
Bonjour,

Finalement, l'utilisation de la moyenne des 4 pixels voisins pour ajouter, en cas de besoin, du Flou dans le bitmap-résultat a été plus efficace que l'ancien flou, donc j'ai procédé à la mise à jour du code et de la capture ... en attendant d'avoir éventuellement d'autres idées d'amélioration.
Pour le reste cette version 2 est un peu plus rapide que l'ancienne grâce à quelques pré-calculs.
J'en ai aussi profité pour permettre l'utilisation avec des fichiers-image du type *.ico, *.jpg, *.gif, *.wmf, *.emf en sus du *.bmp.

A+.
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
2 nov. 2012 à 17:25
Bonjour,

A Caribensila : "Je crois que la possibilité d'ajouter du flou à l'image a été prévue pour atténuer l'effet de crénelage, non ?" :
... Non pas exactement, avec des facteurs d'échelle grands, malgré le léger dégradé de couleurs que j'applique aux coins du carré agrandi il subsiste des frontières entre des plages ayant des couleurs légèrement différentes et c'est pour gommer ces frontières que j'ai prévu la possibilité d'ajouter du flou.

A noter que le crénelage qui existe le cas échéant sur un bitMap-source est complètement supprimé grâce au XBR qui fonctionne comme un jeu de puzzle : à la place d'une marche d'escalier à 45° le carré agrandi est formé par une zone triangulaire de couleur calculée dans l'un des angles et le reste du carré reste de la même couleur que le pixel-source : c'est comme si on comblait les marches d'un vrai escalier avec des poutres de section triangulaire.

"On pourrait peut-être obtenir un meilleur résultat en ce qui concerne l'antialiasing en multipliant le facteur d'échelle demandé par deux, puis en effectuant une réduction 1/2 à l'échelle demandée.
C'est d'ailleurs exactement l'effet obtenu lorsqu'on demande un agrandissement de 400% puisque tu passes toujours par un x8 pour les échelles inférieure à 8, puis tu rétrécis à l'échelle demandée. Et, en zoomant le bitmap, on peut s'apercevoir qu'il y a un effet d'antialiasing pour 400%." :
...OK, comme tu le dis si bien, ça déjà fait.

"Cet effet pourrait sans doute être amélioré en utilisant un autre algo que StretchBlt(HalfTone) pour le rétrissement (un truc tout bête genre la moyenne des 4 pixels source dans le pixel de destination). C'est peut-être une piste de recherche, et si tu es en train d'optimiser l'algo, Pseudo3..."
... Attention StretchBlt(HalfTone) me sert surtout pour ajuster la taille du résultat lorsque le facteur d'échelle n'est soit pas une valeur entière, soit une valeur inférieure à 8.
... Par contre la moyenne des 4 pixels pourrait gommer les frontières visibles entre des plages ayant des couleurs légèrement différentes, j'essayerai demain mais je crains que cela ne marchera que pour le cas de facteurs d'échelle inférieurs à 6 ou 7 ... car avec des facteurs plus grands la moyenne de 4 couleurs ne marche qu'au droit de la frontières mais passé la frontière on se trouve dans une plage monochrome où la moyenne de 4 couleurs identiques c'est cette couleur et la frontière se trouve simplement décalée de 4 pixels.
Pour l'instant j'ai une option où le fonctionnement du XBR s'effectue avec un facteur d'échelle égal aux 2/3 si le facteur souhaité est supérieur à 9 et c'est le StretchBlt(HalfTone) qui me sert en même temps pour agrandir le résultat à l'échelle voulue et pour ajouter du flou mais c'est pas encore suffisant : Dommage car StretchBlt(HalfTone) est bigrement plus rapide que l'ajout de flou sans ASM.

Dès que j'aurai fini je ferai une mise à jour.

A+.
amiga68 Messages postés 54 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 21 décembre 2009
2 nov. 2012 à 16:12
Euh, j'avais oublie : 1/10 !!! ?
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
2 nov. 2012 à 13:48
Même avec le tutoriel, il n'est pas facile à appréhender cet algo !

C'est un très bel exemple d'émulation. Bravo à Barbichette et à Pseudo3.

Je crois que la possibilité d'ajouter du flou à l'image a été prévue pour atténuer l'effet de crénelage, non ?

On pourrait peut-être obtenir un meilleur résultat en ce qui concerne l'antialiasing en multipliant le facteur d'échelle demandé par deux, puis en effectuant une réduction 1/2 à l'échelle demandée.
C'est d'ailleurs exactement l'effet obtenu lorsqu'on demande un agrandissement de 400% puisque tu passes toujours par un x8 pour les échelles inférieure à 8, puis tu rétrécis à l'échelle demandée. Et, en zoomant le bitmap, on peut s'apercevoir qu'il y a un effet d'antialiasing pour 400%.
Cet effet pourrait sans doute être amélioré en utilisant un autre algo que StretchBlt(HalfTone) pour le rétrissement (un truc tout bête genre la moyenne des 4 pixels source dans le pixel de destination).

C'est peut-être une piste de recherche, et si tu es en train d'optimiser l'algo, Pseudo3... :)

10/10
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
30 oct. 2012 à 10:08
Bonjour Barbichette,

Merci pour le 10/10. Pour info je suis en-train de préparer une version 2 plus rapide car je me suis rendu compte que l'on pouvait plus simplement pré-calculer les coefficients de pondération utilisés pour les dégradés de couleurs, les stocker dans une matrice, lui faire subir des rotations, au lieu d'utiliser dans la boucle des polygones triangulaires, de vérifier chaque fois si le point de destination y est présent, de mesurer sa distance par rapport à l'hypothénuse, et de re-calculer à chaque fois les mêmes coeff !!! Mais ma première solution m'a au moins facilité la compréhension du fonctionnement de ce carrousel car avec toutes ces valeurs qui subissent des rotations on prend parfois le vertige.

A+.
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
29 oct. 2012 à 19:10
bravo, voilà la piste que je pensais, mais sans avoir le courage de le faire...
ça mérite bien un 10/10

Barbichette
amiga68 Messages postés 54 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 21 décembre 2009
28 oct. 2012 à 22:09
Joli !!!
Rejoignez-nous