|
| [WD14] dRotation et perte de qualité |
| Iniciado por b0n0b0, 23,nov. 2009 17:07 - 9 respuestas |
| |
| | | |
|
| |
| Publicado el 23,noviembre 2009 - 17:07 |
Bonjour, j'ai essayé d'utiliser dRotation avec un champ image.
Affichage HQ avec Homothétique ... et quand j'effectue un dRotation j'ai des pertes de qualité... bien évidemment de pire en pire puisqu'à chaque nouvelle rotation, viennent s'ajouter les anciennes...
est-ce que quelqu'un sait comment faire pivoter une image en gardant un aspect non aliasé ? ?
merci  |
| |
| |
| | | |
|
| | |
| |
| Publicado el 23,noviembre 2009 - 17:34 |
jonathan a exposé le 23/11/2009 :
Bonjour, j'ai essayé d'utiliser dRotation avec un champ image.
Affichage HQ avec Homothétique ... et quand j'effectue un dRotation j'ai des pertes de qualité... bien évidemment de pire en pire puisqu'à chaque nouvelle rotation, viennent s'ajouter les anciennes...
est-ce que quelqu'un sait comment faire pivoter une image en gardant un aspect non aliasé ? ?
Déjà décocher le HQ...ca évitera un resampling. De toute manière il n'y a pas de moyen de faire des rotations successives sans perte de qualité. Sauf si ce sont des rotations multiples de 90° bien sur... |
| |
| |
| | | |
|
| | |
| |
| Publicado el 23,noviembre 2009 - 18:06 |
J'ai utilisé dChangeMode() avec la constante pour l'anti-aliasing, j'ai placé la dll gdiplus dans le répertoire de l'exécutable, en vain !
Quand je fais ce traitement sur un bouton ON/OFF j'ai une image qui progressivement de déforme...
TANTQUE MoiMême..Enfoncé Multitâche(-2) dChangeMode(dessinAntiAliasing) dRotation(IMG_Vignette,1) FIN |
| |
| |
| | | |
|
| | |
| |
| Publicado el 23,noviembre 2009 - 18:46 |
Une idée :
Pré-calculer toutes les rotations possible à partir de l'image originale, puis les afficher. Ne pas utiliser l'image de la rotation précédente mais toujours l'image d'origine.
Alex |
| |
| |
| | | |
|
| | |
| |
| Publicado el 24,noviembre 2009 - 07:40 |
En vérifiant ce que je disais, je suis tombé sur wikipedia sur l'algorithme de Xiaolin Wu, que je ne connaissais pas, et qui trace des segments de pixels avec antialising. Bref, le rotozoom avec un seul algo de base.
jonathan a écrit dans le message de news <9a6b0473ca2a6d8a770b91d0920bcc7c@news.pcsoft> :
J'ai utilisé dChangeMode() avec la constante pour l'anti-aliasing, j'ai placé la dll gdiplus dans le répertoire de l'exécutable, en vain ! Quand je fais ce traitement sur un bouton ON/OFF j'ai une image qui progressivement de déforme... TANTQUE MoiMême..Enfoncé Multitâche(-2) dChangeMode(dessinAntiAliasing) dRotation(IMG_Vignette,1) FIN |
| |
| |
| | | |
|
| | |
| |
| Publicado el 24,noviembre 2009 - 07:41 |
Bonjour,
Essayez de cacher (rendre invisible) un champ image de référence d'une taille et d'une résolution supérieure à ce que vous afficherez.
Ensuite à chaque fois que vous voulez afficher l'image sous quelque angle que ce soit, faite: 1/ un champclone() sur le champ image de référence 2/ Faites votre rotation avec votre technique 3/ Redimenssionez à la taille qui vous convient 4/ Supprimez l'éventuel précédent champ image cloné (champsupprime()) 5/ Rendez visible le nouveau champ image cloné (qui était invisible jusqu'ici)
C'est un peu brutal, mais c'est une méthode sans programmation sur les pixels composant l'image. Ca ne sera pas le Pérou, mais ca sera surement mieux que ce que vous devez obtenir aujourd'hui car vous éviterez les rotations successives.
Sinon, il n'y a pas de secrets, pour faire ca vraiment bien il faut programmer un rotozoom. Documentez vous sur l'algorithme de tracé de segment de Bresenham (Wikipedia) en y ajoutant un peu de lissage de pixels (article "Débruitez une image" de la LST 76) et vous ferez un rotozoom simple qui fera le boulot.
Cordialement ...
jonathan a écrit dans le message de news <9a6b0473ca2a6d8a770b91d0920bcc7c@news.pcsoft> :
J'ai utilisé dChangeMode() avec la constante pour l'anti-aliasing, j'ai placé la dll gdiplus dans le répertoire de l'exécutable, en vain ! Quand je fais ce traitement sur un bouton ON/OFF j'ai une image qui progressivement de déforme... TANTQUE MoiMême..Enfoncé Multitâche(-2) dChangeMode(dessinAntiAliasing) dRotation(IMG_Vignette,1) FIN |
| |
| |
| | | |
|
| | |
| |
| Publicado el 24,noviembre 2009 - 10:10 |
OK Merci pour vos réponses. J'avais remarqué pour les angle de 90°.
Le code du bouton ON/OFF c'était un test pour voir la progression de la déformation. Le meilleur résultat que j'ai obtenu avant de lire vos suggestions c'est d'affecter une variable avec la valeur de l'angle de rotation et à chaque modification de cette variable.
Ré-affectation du champ image avec l'image originale et re-rotation avec la nouvelle valeur. Avec ça c'est pas aussi "net" qu'un angle de 90 mais c'est déjà mieux, sans trop se fouler niveau programmation.
Pourquoi un pixel est carré et pas rond ? ^^
Bon en tout cas merci, j'explorerai vos suggestions 
bon développement ! |
| |
| |
| | | |
|
| | |
| |
| Publicado el 24,noviembre 2009 - 11:22 |
> Pourquoi un pixel est carré et pas rond ? ^^
Justement, dans le cadre d'une rotation ca devient un inconvénient. Faire le rendu d'une rotation par tracé de segments (avec bresenham ou xiaolin wu) revient à faire un plaquage de texture (texture = image de départ) sur une "grille" de pixels (-> la zone ou s'affichera le résultat) qui ne correspond pas à la "grille" de pixels constituant la texture. D'ou la nécéssité de "lisser" ("moyenner", "filtrer", "faire un anti-crénelage" si vous préférez) les valeurs RVB des pixels des segments projetés ou le rendu final (au plus pratique, au plus performant)
Mais si vous vous en sortez en manipulant les champs images, restez comme ca; c'est beaucoup plus simple.
Cordialement ... |
| |
| |
| | | |
|
| | |
| |
| Publicado el 24,noviembre 2009 - 13:48 |
D'accord merci 
Je vais en effet conserver mon code étant donné que c'était vraiment histoire de proposer la possibilité d'effectuer des rotations de l'image via le clic droit souris, bien que ça ne soit dans mon cas d'utilisation pas du tout nécessaire donc... on verra... peut être je trouverai un composant qui le fera 
ou une fonction dPencherEcran() ^^ |
| |
| |
| | | |
|
| | |
| |
| Publicado el 08,julio 2019 - 12:07 |
Au cas où, certains chercheraient une solution sur ce sujet. J'ai testé plusieurs solutions et la plus efficace, celle qui ne perd ni en taille, ni en résolution a été d'utiliser un objet Bitmap de . Net. Voici un extrait de mon code :
PROCEDURE Rotation_Image(LOCAL pb_Droite est un booléen = Vrai)
//--- On sélectionne l'image de travail en cours (chemin et nom du fichier) ls_ImageOrigine est une chaîne = scs_Image_Fichier
//--- On charge l'image dans un objet Bitmap .Net lPictureBox est un System.Drawing.Bitmap(ls_ImageOrigine) //--- On applique la rotation soit de 90° pour 90° à droite, soit de 270° pour 90° à gauche SI pb_Droite ALORS lPictureBox.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone) SINON lPictureBox.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone) FIN
//--- On sauvegarde le résultat dans le fichier temporaire de travail lPictureBox.Save(scs_Image_Fichier,ImageFormat.Jpeg)
// On réaffiche l'image AfficheImage(scs_Image_Fichier) scb_Image_Modifiee = Vrai
En espérant que ça puisse aider. |
| |
| |
| | | |
|
| | | | |
| | |
|