Come faccio a ruotare una bitmap in GDI Windows, C++?Come ruotare Bitmap in Windows GDI?
risposta
È 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.
Ho pensato che avesse chiesto GDI? –
@ 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. –
Migliorare l'implementazione GDI + raw in quanto RotateFlip è infame per l'eliminazione dell'errore "Errore GDI + generico" piuttosto spesso. –
Suoni come devi usare PlgBlt. Prendi i 4 angoli del tuo rettangolo come 2D Points, ruotali, quindi chiama PlgBlt.
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.
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 –
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.
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
Che tipo di rotazione? Incrementi di 90 gradi, incrementi arbitrari? –