2010-02-16 5 views

Répondre

8

Vous pouvez le faire avec GDI + (#include <gdiplus.h>). La classe Graphics a le RotateTransform method. Cela permet des rotations arbitraires. Utilisez Image::RotateFlip() si vous avez seulement besoin de tourner par incréments de 90 degrés, c'est beaucoup plus efficace.

+2

Je pensais qu'il a demandé GDI? –

+5

@ Frank Krueger - vous devez pouvoir lire sur ce site. Soit ça, soit jeter des pâtes au mur et voir ce qui colle. –

+1

Mieux vaut s'en tenir à l'implémentation brute de GDI + car RotateFlip est tristement célèbre pour avoir jeté l'exception 'Générique GDI + erreur survenue' assez souvent. –

6

Il semble que vous deviez utiliser PlgBlt. Prenez les 4 coins de votre rectangle comme des points 2D, faites-les pivoter, puis appelez PlgBlt.

De MSDN Bitmap Rotation:

Pour copier un bitmap en un parallélogramme; utiliser la fonction PlgBlt , qui effectue un transfert de bit à partir d'un rectangle dans un contexte de périphérique source dans un parallélogramme dans un contexte de périphérique de destination. Pour faire pivoter le bitmap, une application doit fournir les coordonnées, dans le monde unités, à utiliser pour les coins de le parallélogramme.

+0

Les documents PlgBlt mentionnent spécifiquement que les transformations de rotation ne sont pas supportées. C'est exact. Lien: http://msdn.microsoft.com/en-us/library/dd162804%28VS.85%29.aspx –

3

Une autre possibilité (au-delà de celles déjà suggérées) est d'utiliser SetWorldTransform(). Ceci est différent en ce qu'il est modal et s'applique au DC dans son ensemble, pas seulement une seule opération. Si vous voulez faire pivoter un bitmap pivoté, mais d'autres choses sans rotation, ce n'est probablement pas votre meilleur choix. Si vous voulez faire pivoter un certain nombre de choses, ou (surtout) si vous voulez faire pivoter tout ce que vous dessinez (au moins dans un DC), cela peut fonctionner très bien.

+0

J'ai essayé SetWorldTransform() et cela n'avait absolument aucun effet. La documentation indique que le mode graphique du contexte de périphérique doit être défini sur GM_ADVANCED. Je l'ai essayé, et il en est résulté un bitmap totalement noir. C'est ce qui se passe généralement lorsque vous essayez une fonctionnalité Microsoft; cela ne fonctionne pas, et vous passez l'autre 90% de votre temps à essayer de comprendre pourquoi. .NET est nettement meilleur, mais c'est tellement lent. – user20493

Questions connexes