# Grafik auf der Stelle drehen (zentriert) in PictureBox

• ### Frage

• Hoi Freunde,

ich versuchte, auf Grundlage folgenden Codes einen quadratische Bitmap in einer quadratischen Picturebox (jeweils 100;100) zentiert drehen zu lassen.

``` Private Sub btnRotate_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRotate.Click
' Copy the output bitmap from the source image.
Dim bm_in As New Bitmap(PictureBox2.Image) '(My.Resources.TurnControl) '(PictureBox2.Image)

' Make an array of points defining the
' image's corners.
Dim wid As Single = bm_in.Width
Dim hgt As Single = bm_in.Height
Dim corners As Point() = { _
New Point(0, 0), _
New Point(wid, 0), _
New Point(0, hgt), _
New Point(wid, hgt)}

' Translate to center the bounding box at the origin.
Dim cx As Single = wid / 2
Dim cy As Single = hgt / 2
Dim i As Long
For i = 0 To 3
corners(i).X -= cx
corners(i).Y -= cy
Next i

' Rotate.
Dim theta As Single = Single.Parse(45) * PI _
/ 180.0
Dim sin_theta As Single = Sin(theta)
Dim cos_theta As Single = Cos(theta)
Dim X As Single
Dim Y As Single
For i = 0 To 3
X = corners(i).X
Y = corners(i).Y
corners(i).X = X * cos_theta + Y * sin_theta
corners(i).Y = -X * sin_theta + Y * cos_theta
Next i

' Translate so X >= 0 and Y >=0 for all corners.
Dim xmin As Single = corners(0).X
Dim ymin As Single = corners(0).Y
For i = 1 To 3
If xmin > corners(i).X Then xmin = corners(i).X
If ymin > corners(i).Y Then ymin = corners(i).Y
Next i
For i = 0 To 3
corners(i).X -= xmin
corners(i).Y -= ymin
Next i

' Create an output Bitmap and Graphics object.
Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * _
ymin))
Dim gr_out As Graphics = Graphics.FromImage(bm_out)

' Drop the last corner lest we confuse DrawImage,
' which expects an array of three corners.
ReDim Preserve corners(2)

' Draw the result onto the output Bitmap.
gr_out.DrawImage(bm_in, corners)

' Display the result.
PictureBox2.Image = bm_out
PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
PictureBox2.Invalidate()
PictureBox2.Refresh()

End Sub```

Er dreht auch brav (in diesem Fall jeweils 45° bei jedem Klick), verkleinert das Bild aber immer weiter bei jedem weiteren Klick.

Ich bastel nun schn etwas dran rum und habe auch andere Sachen schon gelesen, aber da ich nicht wirklich der "Grafiker" bin fhelt mir da wohl 'ne Synapse in der Main-CPU :-)

Doei

Franz

Be a good forum member - mark posts that contain the answers to your questions or those that are helpful

Sonntag, 30. September 2012 13:49

### Antworten

• Hallo Franz,

fürs Drehen ist die Methode RotateTransform bereits eingebaut.
Um um den Mittelpunkt zu drehen legt man TranslateTransform entsprechend fest.

Damit sich die Qualität nicht verringert bzw. die Seiten ausfransen, sollte man immer vom Original ausgehend eine Kopie erstellen.

Siehe C# Tutorial - Image Editing: Rotate - ist zwar C# aber im wesentlichen muss man nur das Semikolon streichen.

Gruß Elmar

Montag, 1. Oktober 2012 09:52
• Hallo Franz,

nachfolgenden Code habe ich - wenn ich ich recht entsinne - sogar von Elmar.
Elmar, ich hoffe, das stimmt und der Code ist nicht Unfug. ... möchte die nicht kompromitieren, mich aber auch nicht mit fremden Federn schmücken.

```Imports System.Drawing.Drawing2D
Imports System.Math

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim bm_in As New Bitmap(My.Resources.Bild)
'// Array von Punkten, die die Bild Ecken definieren
Dim wid As Single = bm_in.Width
Dim hgt As Single = bm_in.Height
Dim corners As Point() = { _
New Point(0, 0), _
New Point(wid, 0), _
New Point(0, hgt), _
New Point(wid, hgt)}

'//Translation
Dim cx As Single = wid / 2
Dim cy As Single = hgt / 2
Dim i As Long
For i = 0 To 3
corners(i).X -= cx
corners(i).Y -= cy
Next i

'//Drehen
Dim theta As Single = Single.Parse(-TextBox1.Text) * PI / 180.0 '//Beliebigen Winkel eingeben
Dim sin_theta As Single = Sin(theta)
Dim cos_theta As Single = Cos(theta)
Dim X As Single
Dim Y As Single
For i = 0 To 3
X = corners(i).X
Y = corners(i).Y
corners(i).X = X * cos_theta + Y * sin_theta
corners(i).Y = -X * sin_theta + Y * cos_theta
Next i

'//Translate, so das X >= 0 und Y >=0 für alle Ecken
Dim xmin As Single = corners(0).X
Dim ymin As Single = corners(0).Y
For i = 1 To 3
If xmin > corners(i).X Then xmin = corners(i).X
If ymin > corners(i).Y Then ymin = corners(i).Y
Next i
For i = 0 To 3
corners(i).X -= xmin
corners(i).Y -= ymin
Next i

'//Output Bitmap als Graphisches Objekt
Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
Dim gr_out As Graphics = Graphics.FromImage(bm_out)

ReDim Preserve corners(2)

'//Resultat in das Output Bitmap speichern
gr_out.DrawImage(bm_in, corners)

'//Endresultat
PictureBox1.Image = bm_out

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.PictureBox1.Image = My.Resources.Bild
End Sub
End Class```

Wie auch immer, er funzt.

Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 and VB 2010 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful. c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/

Montag, 1. Oktober 2012 20:12

### Alle Antworten

• Hallo Franz,

fürs Drehen ist die Methode RotateTransform bereits eingebaut.
Um um den Mittelpunkt zu drehen legt man TranslateTransform entsprechend fest.

Damit sich die Qualität nicht verringert bzw. die Seiten ausfransen, sollte man immer vom Original ausgehend eine Kopie erstellen.

Siehe C# Tutorial - Image Editing: Rotate - ist zwar C# aber im wesentlichen muss man nur das Semikolon streichen.

Gruß Elmar

Montag, 1. Oktober 2012 09:52
• Hallo Franz,

nachfolgenden Code habe ich - wenn ich ich recht entsinne - sogar von Elmar.
Elmar, ich hoffe, das stimmt und der Code ist nicht Unfug. ... möchte die nicht kompromitieren, mich aber auch nicht mit fremden Federn schmücken.

```Imports System.Drawing.Drawing2D
Imports System.Math

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim bm_in As New Bitmap(My.Resources.Bild)
'// Array von Punkten, die die Bild Ecken definieren
Dim wid As Single = bm_in.Width
Dim hgt As Single = bm_in.Height
Dim corners As Point() = { _
New Point(0, 0), _
New Point(wid, 0), _
New Point(0, hgt), _
New Point(wid, hgt)}

'//Translation
Dim cx As Single = wid / 2
Dim cy As Single = hgt / 2
Dim i As Long
For i = 0 To 3
corners(i).X -= cx
corners(i).Y -= cy
Next i

'//Drehen
Dim theta As Single = Single.Parse(-TextBox1.Text) * PI / 180.0 '//Beliebigen Winkel eingeben
Dim sin_theta As Single = Sin(theta)
Dim cos_theta As Single = Cos(theta)
Dim X As Single
Dim Y As Single
For i = 0 To 3
X = corners(i).X
Y = corners(i).Y
corners(i).X = X * cos_theta + Y * sin_theta
corners(i).Y = -X * sin_theta + Y * cos_theta
Next i

'//Translate, so das X >= 0 und Y >=0 für alle Ecken
Dim xmin As Single = corners(0).X
Dim ymin As Single = corners(0).Y
For i = 1 To 3
If xmin > corners(i).X Then xmin = corners(i).X
If ymin > corners(i).Y Then ymin = corners(i).Y
Next i
For i = 0 To 3
corners(i).X -= xmin
corners(i).Y -= ymin
Next i

'//Output Bitmap als Graphisches Objekt
Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
Dim gr_out As Graphics = Graphics.FromImage(bm_out)

ReDim Preserve corners(2)

'//Resultat in das Output Bitmap speichern
gr_out.DrawImage(bm_in, corners)

'//Endresultat
PictureBox1.Image = bm_out

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.PictureBox1.Image = My.Resources.Bild
End Sub
End Class```

Wie auch immer, er funzt.

Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 and VB 2010 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful. c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/

Montag, 1. Oktober 2012 20:12
• Hallo Stefan,

nee, der Code kann nicht von mir stammen - ich benenne u. a. Variablen anders etc...

Eine Fundstelle ist: http://www.vb-helper.com/howto_net_image_rotate.html  und die von Franz sieht sehr ähnlich aus;
wobei die Kommentare - das ' // -  bei Dir eine C# Herkunft andeuten - das mag aber wiederum portiert sein.

Gruß Elmar

Dienstag, 2. Oktober 2012 07:12
• Hallo Elmar,

das mit dem '// ist auf meinem Mist gewachsten. // ist ein "Relikt" aus meiner C++ Zeit.
Ist ja auch egal. Wichtig war mir nur, mich nicht mit fremden Federn zu schmücken.

Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 and VB 2010 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful. c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/

Dienstag, 2. Oktober 2012 14:58
• Hallo Trixi-N,

Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

Grüße,
Robert

• Als Antwort markiert Montag, 5. August 2013 12:25
• Tag als Antwort aufgehoben Montag, 5. August 2013 13:02
Donnerstag, 11. Oktober 2012 14:04