在pictureBox中旋转图像

时间:2010-11-10 11:43:43

标签: c# .net image picturebox

我正在制作一个模拟时钟,我必须在我的pictureBox中旋转图像......

e.g。我想每秒将图像旋转6度。

我能为此做些什么?

...谢谢

3 个答案:

答案 0 :(得分:4)

我记得前一段时间曾经写过类似时钟的UserControl。这是执行您请求的基本代码。

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

备注
 1.在表单(或用户控件)中添加名为Clock的PictureBox  2.为时钟背景(时钟的面部)添加一个名为ClockBack的资源  3.为时钟的玻璃面添加一个名为ClockGlass的资源  4.在表格中删除上面的代码  5.将计时器的间隔设置为1000,并使其Tick事件RefreshInvalidate时钟[这是一个PictureBox]。


请注意,当设置为true时,变量 _independentHands 会使时钟的指针彼此独立。
例如,当设置为False时,4:30将时针设置在4到5之间。当True时,时针将在4到4:59:59之间并且将'在5:00:00跳到5点。

我更喜欢把它留给假,以便给自然时钟感觉。

答案 1 :(得分:1)

答案 2 :(得分:0)

试试这个

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

或每1000毫秒在一个线程中旋转