none
Grafik auf der Stelle drehen (zentriert) in PictureBox RRS feed

  • 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


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

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