2010-02-16 16 views

risposta

8

È possibile farlo con GDI + (#include <gdiplus.h>). La classe Graphics ha il RotateTransform method. Ciò consente rotazioni arbitrarie. Usa Image::RotateFlip() se hai solo bisogno di ruotare di 90 gradi, è molto più efficiente.

+2

Ho pensato che avesse chiesto GDI? –

+5

@ Frank Krueger: devi essere in grado di leggere la mente su questo sito. O quello, o getti la pasta sul muro e vedi cosa attacca. –

+1

Migliorare l'implementazione GDI + raw in quanto RotateFlip è infame per l'eliminazione dell'errore "Errore GDI + generico" piuttosto spesso. –

6

Suoni come devi usare PlgBlt. Prendi i 4 angoli del tuo rettangolo come 2D Points, ruotali, quindi chiama PlgBlt.

Da MSDN Bitmap Rotation:

Per copiare una bitmap in un parallelogramma; utilizzare la funzione PlgBlt , che esegue il trasferimento di bit block da un rettangolo in un contesto di dispositivo di origine in un parallelogramma nel contesto di dispositivo di destinazione in . Per ruotare la bitmap, un'applicazione deve fornire le coordinate, in mondo unità, da utilizzare per gli angoli di il parallelogramma.

+0

I documenti di PlgBlt menzionano specificamente che le trasformazioni di rotazione non sono supportate. È accurato Link: http://msdn.microsoft.com/en-us/library/dd162804%28VS.85%29.aspx –

3

Un'altra possibilità (oltre a quelle già suggerite) è quella di utilizzare SetWorldTransform(). Questo è diverso in quanto è modale e si applica alla DC nel suo complesso, non solo una singola operazione. Se si desidera ruotare una bitmap ruotata, ma altre cose senza rotazione, probabilmente non è la scelta migliore. Se vuoi disegnare una serie di cose ruotate, o (soprattutto) se vuoi ruotare tutto ciò che disegni (almeno in una DC), può funzionare abbastanza bene.

+0

Ho provato SetWorldTransform() e non ha avuto alcun effetto. La documentazione dice che la modalità grafica del contesto del dispositivo deve essere impostata su GM_ADVANCED. L'ho provato e il risultato è stato una bitmap totalmente nera. Questo è ciò che di solito accade quando si prova una funzionalità Microsoft; non funziona e passi l'altro 90% del tuo tempo a cercare di capire perché. .NET è notevolmente migliore, ma è così lento. – user20493