Canvas in 90 Grad Schritten drehen

Hey zusammen!

Ich brauch mal wieder Euer geschätztes Wissen :slightly_smiling_face:

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? :gear:

Danke schon mal & viele Grüße! :victory_hand:

Schau Dir mal den Blog Beitrag von Xojo an. Der zeigt Dir, wie Du ein Bild (Picture) rotierst.

1 Like

Wow, damit hatte ich ja gar nicht so schnell gerechnet! Vielen lieben Dank für die schnelle Antwort! :blush:

Der Blog zeigt genau das, was ich mir vorgestellt habe – einfach perfekt! :sparkles:

Danke nochmal! :raising_hands:

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:

  1. ein Picture in der “gedrehten” Größe neu anlegen
  2. mit zwei geschachtelten Schleifen im Original lesen und vertauscht ins Picture schreiben
  3. das neue Picture ins Canvas kopieren, z.B. über Backdrop

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
1 Like

… 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

2 Likes

Ich habe das jetzt testen können. Vielen Dank für die Hilfe. Das ist tatsächlich der schnellere Weg.