Rotate image in pictureBox

前端 未结 3 849
天涯浪人
天涯浪人 2020-12-11 23:47

I am making an Analogue Clock in which i have to rotate the image in my pictureBox...

e.g. i want to rotate my image by 6 degrees every second.

what can i d

相关标签:
3条回答
  • 2020-12-12 00:38

    I remember ever writing a Clock-like UserControl some time ago. Here's the fundamental code to do your request.

    Private Sub Paint_Clock(ByVal sender As Object, _
                            ByVal e As System.Windows.Forms.PaintEventArgs) _
                            Handles Clock.Paint
    
        Dim _independentHands as Boolean = False
        Dim g As Graphics = e.Graphics
        Dim centrePoint As Point = New Point(Clock.Width \ 2, Clock.Height \ 2)
             Dim _time As New TimeSpan(5, 2, 15)
        'pens'
        Dim hourPen As New Pen(Color.Black, 3)
        Dim minPen As New Pen(Color.Black, 2)
        Dim secPen As New Pen(Color.Red, 1)
    
        'clock hand lengths'
        Dim halfClockWidth As Integer = Clock.Width \ 2
        Dim hourLength As Integer = CInt(halfClockWidth * (4 / 6)) - 5
        Dim minLength As Integer = CInt(halfClockWidth * (5 / 6)) - 5
        Dim secLength As Integer = CInt(halfClockWidth * (5 / 6)) - 5
        Dim secLength2 As Integer = CInt(halfClockWidth * (1 / 6))
    
        'angles'
        Dim secAngle As Single = CSng(_time.Seconds / 60) * 360
        Dim secAngle2 As Single = secAngle - 180
        Dim minAngle As Single = CSng(_time.Minutes / 60) * 360
        Dim hrAngle As Single = CSng((_time.Hours - 12) / 12) * 360
        If Not _independentHands Then minAngle += (secAngle / 60)
        If Not _independentHands Then hrAngle += (minAngle / 12)
    
        'centre point'
        Dim pointPen As New Pen(Color.Black, 4)
        Dim pointRect As New Rectangle(centrePoint.X - 2, centrePoint.Y - 2, 4, 4)
    
        'antialias on'
        g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    
        'draw the background'
        g.DrawImage(My.Resources.ClockBack, 0, 0, Clock.Width, Clock.Height)
    
        'draw the hands'
        g.DrawLine(hourPen, centrePoint, GetPoint2(centrePoint, hrAngle, hourLength))
        g.DrawLine(minPen, centrePoint, GetPoint2(centrePoint, minAngle, minLength))
        g.DrawLine(secPen, centrePoint, GetPoint2(centrePoint, secAngle, secLength))
        g.DrawLine(secPen, centrePoint, GetPoint2(centrePoint, secAngle2, secLength2))
    
        'draw the centre point'
        g.DrawEllipse(pointPen, pointRect)
    
        'draw the glass'
        g.DrawImage(My.Resources.ClockGlass, 0, 0, Clock.Width, Clock.Height)
    End Sub
    
    
    
    Private Function GetPoint2(ByVal startPoint As Point, _
                               ByVal angle As Single, _
                               ByVal length As Integer) As Point
    
        Dim x, y As Integer
        Dim sp As Point = startPoint
    
        'normalize'
        Do While angle - 360 > 0
            angle -= 360
        Loop
        Do While angle < 0
            angle += 360
        Loop
        If angle = 360 Then angle = 0
    
        Dim rad = angle * (Math.PI / 180)    'angle in radians'
        'calc the new point'
        x = CInt(length * Math.Sin(rad))
        y = CInt(length * Math.Cos(rad))
    
        Return New Point(sp.X + x, sp.Y - y)
    End Function
    

    Notes
    1. Add a PictureBox with the name Clock to your form (or usercontrol)
    2. Add a resource called ClockBack for the background of your clock (the clock's face).
    3. Add a resource called ClockGlass for the clock's glassy face.
    4. Drop the code above in your form.
    5. Set a timer's interval to 1000 and have its Tick event Refresh or Invalidate the Clock [which is a PictureBox].


    Please note that the variable _independentHands makes the clock's hands independent of each other when set to true.
    For example, when set to False, 4:30 will have the hour hand halfway between 4 and 5. When True, the hour hand will be on 4 up till 4:59:59 and will 'jump' to 5 at 5:00:00.

    I prefer to leave it to false so as to give the natural clock feel.

    0 讨论(0)
  • 2020-12-12 00:39

    try this

    pictureBox1.Image.RotateFlip((RotateFlipType.Rotate90FlipX));

    or rotate this in a thread per 1000 ms

    0 讨论(0)
  • 2020-12-12 00:46

    Here below links for question

    C# Image/PictureBox Rotations - CodeProject

    Rotating PictureBox Control - CodeProject

    0 讨论(0)
提交回复
热议问题