如何将PictureBox控件中的图形逆时针旋转90度!旋转后的图像仍放在这个控件中?

解决方案 »

  1.   

    参考:
    是否可以实现一图片旋转90度
    http://www.china-askpro.com/msg8/qa36.shtml
      

  2.   

    VB中位图旋转的实现
     
    VB中位图旋转的实现
    www.codesky.net  2003-8-15  自由创意工作室在VISUAL BASIC中没有什么命令或函数能够实现将一个位图旋转一个角度后显示出来,但我们可以用画点的方式,将一个图画盒中的位图中的像素点旋转一个角度后画入另一个图画盒中,当源图画盒中的像素都被画到目标图画盒中时,也就完成了位图的旋转。这里主要用到了VISUAL BASIC中的两个方法:POINT方法和PSET方法。POINT方法的作用是从源图画盒中提取一个像素点的颜色值;而PSET方法的作用是按照旋转后的坐标和相应像素点的颜色值在目标图画盒中画点。显然这个方法的速度不会太快,因而适用于较小的图片。下面介绍一下实现方法:进入VISUAL BASIC中,建立一个新的窗体。在窗体中加入两个图画盒控件(Picture1和Picture2),设置它们的Name属性为PicSource和PicTarget,并为PicSource图画盒的Picture属性设置一幅位图。再在窗体中加入一个按钮(CommandRotorate),设置它的Caption属性为“旋转”。然后加入以下代码:
    Option Explicit
    Const Pi = 3.14
    Private Sub CommandRototate_Click()
    Dim x As Integer, y As Integer
    Dim X1 As Integer, Y1 As Integer
    Dim X2 As Double, Y2 As Double
    Dim X3 As Double, Y3 As Double
    Dim JiaoDu As Double
    Dim HuDu As Double
    JiaoDu = 45 '角度
    HuDu = JiaoDu * Pi / 180 '弧度
    PicSource.ScaleMode = vbPixels
    PicTarget.ScaleMode = vbPixels
    For x = 0 To PicTarget.ScaleWidth
    X1 = x - PicTarget.ScaleWidth \ 2
    For y = 0 To PicTarget.ScaleHeight
    Y1 = y - PicTarget.ScaleHeight \ 2
    X2 = X1 * Cos(-HuDu) + Y1 * Sin(-HuDu)
    Y2 = Y1 * Cos(-HuDu) - X1 * Sin(-HuDu)
    X3 = X2 + PicSource.ScaleWidth \ 2
    Y3 = Y2 + PicSource.ScaleHeight \ 2
    If X3 > 0 And X3 < PicSource.ScaleWidth - 1 And Y3 > 0 And Y3 < 
    PicSource.ScaleHeight - 1 Then
    PicTarget.PSet (x, y), PicSource.Point(X3, Y3)
    End If
    Next y
    Next x
    End Sub
    运行后,按下“旋转”按钮,可以见到源图画盒中的位图旋转45度后进入到目标图画盒中。如果要改变旋转的角度,只需将JiaoDu变量设置为相应值即可。 
      

  3.   

    我用GETPIAXL和SETPIAXL已经实现了,这样也还是太慢了,有没有快的方法呢?
      

  4.   

    不知道用BITBLT可以实现位图的旋转传送么?
      

  5.   

    http://www.china-askpro.com/msg8/qa36.shtml
    看了吗?肯定慢
      

  6.   

    如果是win2000下倒是有现成的api可以使用
      

  7.   

    Const SRCCOPY = &HCC0020
                   Const Pi = 3.14159265359
                   Private Declare Function SetPixel Lib "GDI32" (ByVal hDC As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal crColor As Long) As Long
                   Private Declare Function GetPixel Lib "GDI32" (ByVal hDC As Integer, ByVal X As Integer, ByVal Y As Integer) As Long
                   Private Declare Function StretchBlt% Lib "GDI32" (ByVal hDC%, ByVal X%, ByVal Y%, ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%, ByVal nSrcWidth%, ByVal nSrcHeight%, ByVal dwRop&)               Sub Form_Load()
                    Picture1.ScaleMode = 3
                    Picture2.ScaleMode = 3
                   End Sub
                   Sub Command1_Click()
                   'flip horizontal
                    Picture2.Cls
                    px% = Picture1.ScaleWidth
                    py% = Picture1.ScaleHeight
                    retval% = StretchBlt(Picture2.hDC, px%, 0, -px%, py%, Picture1.hDC, 0, 0, px%, py%, SRCCOPY)
                   End Sub
                   Sub Command2_Click()
                    'flip vertical
                    Picture2.Cls
                    px% = Picture1.ScaleWidth
                    py% = Picture1.ScaleHeight
                    retval% = StretchBlt(Picture2.hDC, 0, py%, px%, -py%, Picture1.hDC, 0, 0, px%, py%, SRCCOPY)
                   End Sub               Sub Command3_Click()
                    'rotate 45 degrees
                    Picture2.Cls
                    Call bmp_rotate(Picture1, Picture2, 3.14 / 4)
                   End Sub
                   Sub bmp_rotate(pic1 As PictureBox, pic2 As PictureBox, ByVal theta!)
                    ' bmp_rotate(pic1, pic2, theta)
                    ' Rotate the image in a picture box.
                    '   pic1 is the picture box with the bitmap to rotate
                    '   pic2 is the picture box to receive the rotated bitmap
                    '   theta is the angle of rotation
                    Dim c1x As Integer, c1y As Integer
                    Dim c2x As Integer, c2y As Integer
                    Dim a As Single
                    Dim p1x As Integer, p1y As Integer
                    Dim p2x As Integer, p2y As Integer
                    Dim n As Integer, r   As Integer                c1x = pic1.ScaleWidth \ 2
                    c1y = pic1.ScaleHeight \ 2
                    c2x = pic2.ScaleWidth \ 2
                    c2y = pic2.ScaleHeight \ 2                If c2x < c2y Then n = c2y Else n = c2x
                    n = n - 1
                    pic1hDC% = pic1.hDC
                    pic2hDC% = pic2.hDC                For p2x = 0 To n
                      For p2y = 0 To n
                        If p2x = 0 Then a = Pi / 2 Else a = Atn(p2y / p2x)
                        r = Sqr(1& * p2x * p2x + 1& * p2y * p2y)
                        p1x = r * Cos(a + theta!)
                        p1y = r * Sin(a + theta!)
                        c0& = GetPixel(pic1hDC%, c1x + p1x, c1y + p1y)
                        c1& = GetPixel(pic1hDC%, c1x - p1x, c1y - p1y)
                        c2& = GetPixel(pic1hDC%, c1x + p1y, c1y - p1x)
                        c3& = GetPixel(pic1hDC%, c1x - p1y, c1y + p1x)
                        If c0& <> -1 Then xret& = SetPixel(pic2hDC%, c2x + p2x, c2y + p2y, c0&)
                        If c1& <> -1 Then xret& = SetPixel(pic2hDC%, c2x - p2x, c2y - p2y, c1&)
                        If c2& <> -1 Then xret& = SetPixel(pic2hDC%, c2x + p2y, c2y - p2x, c2&)
                        If c3& <> -1 Then xret& = SetPixel(pic2hDC%, c2x - p2y, c2y + p2x, c3&)
                      Next
                      t% = DoEvents()
                    Next
                   End Sub
      

  8.   

    知道了,都是逐点转换,先结帖子吧,如果你有更好的方法,如直接操作内存的方法,请E到[email protected] 谢谢