Hey zusammen!
Ich brauch mal wieder Euer geschätztes Wissen
Ich möchte per Knopfdruck mein viereckiges Canvas in 90°-Schritten drehen.
Hat jemand eine Idee, wie ich das schnell und möglichst einfach umsetzen kann?
Danke schon mal & viele Grüße!
Hey zusammen!
Ich brauch mal wieder Euer geschätztes Wissen
Ich möchte per Knopfdruck mein viereckiges Canvas in 90°-Schritten drehen.
Hat jemand eine Idee, wie ich das schnell und möglichst einfach umsetzen kann?
Danke schon mal & viele Grüße!
Schau Dir mal den Blog Beitrag von Xojo an. Der zeigt Dir, wie Du ein Bild (Picture) rotierst.
Wow, damit hatte ich ja gar nicht so schnell gerechnet! Vielen lieben Dank für die schnelle Antwort!
Der Blog zeigt genau das, was ich mir vorgestellt habe – einfach perfekt!
Danke nochmal!
Kommt darauf an, wie schnell es gehen muss. Der Zugriff über RGBSuface.pixel(x,y) ist recht flott, kann aber natürlich nicht mit dem C-Code aus einem Plugin mithalten. Der Vorteil wäre, dass es mit Bordmitteln möglich ist. Einfach mal ausprobieren:
Eventuell muss da am Canvas noch was skaliert werden, sofern es nicht quadratisch ist …
Wenn ich heute abend Zeit habe, schreib ich mal ein Beispiel. Es beruht darauf, dass man durch Spiegeln auch Drehungen “simulieren” kann.
Das Beispiel würde mich sehr interessieren. Ich war auch schon mehr an einer Flipfunktion am überlegen, weil meine Bilder alle viereckig sind.
Wenn Du nicht die eingebaute Rotate-Funktion verwenden willst (das dürfte die schnellste Variante sein, aber ich habe es nicht ausprobiert), kannst Du es auch leicht ohne diese bewerkstelligen. Zum Beispiel:
Public Function RotateClockwise90Degrees(aPicture as Picture) As Picture
var originalWidth as Integer = aPicture.Width
var maxX as Integer = originalWidth - 1
var originalHeight as Integer = aPicture.Height
var maxY as Integer = originalHeight - 1
var rotatedPicture as new Picture(originalHeight, originalWidth)
var originalRGBSurface as RGBSurface = aPicture.RGBSurface
var rotatedRGBSurface as RGBSurface = rotatedPicture.RGBSurface
var x, y as Integer
for y = 0 to maxY
for x = 0 to maxX
rotatedRGBSurface.Pixel(maxY - y, maxX - x) = originalRGBSurface.Pixel(x, y)
next x
next y
return rotatedPicture
End Function
… das ist schneller
Public Function Rotate90Degrees(extends p as Picture, clockWise as Boolean = True) As Picture
Var thePicture As New Picture(p.Height, p.Width)
thePicture.Graphics.SaveState
Const kPi As Double=3.1415926535
Var angle As Double=kPi/2
If Not clockWise Then angle=-angle
Var dx As Double=p.Width/2
Var dy As Double=p.Height/2
thePicture.Graphics.Translate dy, dx
thePicture.Graphics.Rotate angle
thePicture.Graphics.Translate -dx, -dy
thePicture.Graphics.DrawPicture p, 0, 0
Return thePicture
End Function
Ich habe das jetzt testen können. Vielen Dank für die Hilfe. Das ist tatsächlich der schnellere Weg.