2010-02-16 24 views

Respuesta

8

Puede hacerlo con GDI + (#include <gdiplus.h>). La clase Graphics tiene el RotateTransform method. Eso permite rotaciones arbitrarias. Use Image::RotateFlip() si solo necesita girar en incrementos de 90 grados, eso es mucho más eficiente.

+2

¿Creí que había pedido GDI? –

+5

@Frank Krueger: debe poder leer la mente en este sitio. O eso, o tirar la pasta a la pared y ver qué se pega. –

+1

Mejor se adhiere a la implementación bruta de GDI + ya que RotateFlip es infame por rechazar la excepción 'Error GDI + genérico' con bastante frecuencia. –

6

Parece que tiene que usar PlgBlt. Tome las 4 esquinas de su rectángulo como puntos 2D, rótelas y luego llame a PlgBlt.

De MSDN Bitmap Rotation:

Para copiar un mapa de bits en un paralelogramo; utilice la función PlgBlt , que realiza una transferencia de bloque de bits desde un rectángulo en un contexto de dispositivo fuente en un paralelogramo en contexto de dispositivo de destino. Para rotar el mapa de bits, una aplicación debe proporcionar las coordenadas, en el mundo unidades, que se utilizarán para las esquinas de el paralelogramo.

+0

Los documentos PlgBlt mencionan específicamente que las transformaciones de rotación no son compatibles. Eso es exacto Enlace: http://msdn.microsoft.com/en-us/library/dd162804%28VS.85%29.aspx –

3

Otra posibilidad (más allá de las ya sugeridas) es utilizar SetWorldTransform(). Esto es diferente ya que es modal y se aplica al DC como un todo, no solo a una sola operación. Si desea rotar un mapa de bits girado, pero otras cosas sin rotación, probablemente no sea su mejor opción. Si quieres dibujar un número de cosas giradas, o (especialmente) si quieres rotar todo lo que dibujas (al menos en un DC), puede funcionar muy bien.

+0

Probé SetWorldTransform() y no tuvo absolutamente ningún efecto. La documentación dice que el modo de gráficos del contexto del dispositivo debe establecerse en GM_ADVANCED. Lo intenté, y resultó en un mapa de bits totalmente negro. Esto es lo que suele ocurrir al probar una función de Microsoft; no funciona, y pasas el 90% de tu tiempo tratando de descubrir por qué. .NET es notablemente mejor, pero es muy lento. – user20493