cs_pseudo3
Messages postés268Date d'inscriptionmardi 24 juillet 2007StatutMembreDernière intervention 2 février 20211 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és268Date d'inscriptionmardi 24 juillet 2007StatutMembreDernière intervention 2 février 20211 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és54Date d'inscriptiondimanche 23 février 2003StatutMembreDernière intervention21 décembre 2009 2 nov. 2012 à 16:12
Euh, j'avais oublie : 1/10 !!! ?
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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és268Date d'inscriptionmardi 24 juillet 2007StatutMembreDernière intervention 2 février 20211 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és54Date d'inscriptiondimanche 23 février 2003StatutMembreDernière intervention21 décembre 2009 28 oct. 2012 à 22:09
3 nov. 2012 à 14:46
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+.
2 nov. 2012 à 17:25
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+.
2 nov. 2012 à 16:12
2 nov. 2012 à 13:48
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
30 oct. 2012 à 10:08
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+.
29 oct. 2012 à 19:10
ça mérite bien un 10/10
Barbichette
28 oct. 2012 à 22:09