我在Picture中加载了一张图片,但是想将图片旋转一定角度显示,请问该怎么做?

解决方案 »

  1.   

    图像的反转,放大和缩小都可以用StretchBlt来完成.相关申明如下:
    Private Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
    Private Const SRCCOPY = &HCC0020 
    Dim w As Integer
    Dim h As Integer
    图像翻转通过改变坐标原点和图像写入方向来实现,我只以"左右翻转"为例加以说明,旋转一定角度类似,你自己灵活运用.
    '具体实现部分如下Me.ScaleMode = 3
    w = Picture1.Width
    h = Picture1.Height
    StretchBlt Me.hdc, w, 0, -w, h, Picture1.hdc, 0, 0, w, h, SRCCOPY原理:
     在这里,源DC和目标DC的原点分别为(0,0)和(w,0),因此StetchBlt从(0,0)开始读取源DC的图像,并从(w,0)开始把图像写入目标DC,这里写入方向与读取方向相反,从而使目标翻转.附:StretchBlt的具体说明StretchBlt VB声明 
    Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long 
    说明 
    将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。这个函数会在设备场景中定义一个目标矩形,并在位图中定义一个源图象。源矩形会根据需要进行伸缩,以便与目标矩形的大小相符 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hdc Long,目标设备场景 
    x,y Long,目标矩形左上角的x,y坐标,以逻辑坐标表示 
    nWidth,nHeight Long,目标矩形的宽度和高度,以逻辑坐标表示 
    hSrcDC Long,源设备场景。如光栅运算未指定一个源,则这个参数应为零 
    xSrc,ySrc Long,用源DC的逻辑坐标表示的源矩形左上角位置 
    nSrcWidth,nSrcHeight Long,分别指定用逻辑单位(以源DC为基础)传输的一幅图象的宽度和高度。如其中有一个参数的符号(指正负号)与对应的目标参数不符,位图就会在对应的轴上作镜像转换处理 
    dwRop Long,传输过程中进行的光栅运算。如刷子属于光栅运算的一部分,就使用选入目标DC的刷子 
    注解 
    可用GetDeviceCaps函数判断特定的设备场景是否支持此函数
    不可选择对源位图进行剪切或旋转处理,源位图也不能是一个图元文件设备场景
     
      

  2.   

    我只会把图像做水平或垂直的翻转,如下:Option Explicit
       
    Dim bHort As Boolean
    Dim bVert As Boolean
    Private Sub Command1_Click(Index As Integer)
        Dim pic As StdPicture
        
        Set pic = Picture1.Picture
       
        Picture1.Cls
        Select Case Index
            Case 0
                bHort = Not bHort
            Case 1
                bVert = Not bVert
        End Select
    '    Picture1
        If bHort And bVert Then
            Picture1.PaintPicture pic, Picture1.Width, Picture1.Height, Picture1.Width * -1, Picture1.Height * -1
        ElseIf bHort And Not bVert Then
            Picture1.PaintPicture pic, Picture1.Width, 0, Picture1.Width * -1, Picture1.Height
        ElseIf Not bHort And bVert Then
            Picture1.PaintPicture pic, 0, Picture1.Height, Picture1.Width, Picture1.Height * -1
        Else
            Picture1.PaintPicture pic, 0, 0
        End If
    End Sub
      

  3.   

    很感谢上面两位。但是我还是转不过来。我现在有一段程序(图片是居中的)。
    If PrintsetForm.Option1.Value = True Then
    '正常放置图片
      Picture1.PaintPicture Picture2.Picture, (Picture1.Width -Picture2.Width ) / 2, (Picture1.Height - Picture2.Height) / 2,  Picture2.ScaleWidth,  Picture2.ScaleHeight 
    Else
    If PrintsetForm.Option2.Value = True Then
    '图片旋转90度,仍然要求居中(但是这里是整个的翻转了180度)
    A = (Picture1.Width - Picture2.Width ) / 2
    B = Picture1.Height - (Picture1.Height - Picture2.Height) / 2
    Picture1.PaintPicture Picture2.Picture, A, b,  Picture2.ScaleHeight , -Picture2.ScaleWidth 
    End If
    End If
    还希望帮我看看!
      

  4.   

    可以使用BitBlt/StretchBlt实现图片旋转90度。
    具体的做法可以参考微软的Knowledge Base的文章:“Q186260 OWTO: Rotate a Bitmap Image in 90-Degree Increments”。
    这篇文章介绍了如何旋转90度。
    如果你想旋转任意角度,可以参考Delphi的例子http://www.efg2.com/lab/ImageProcessing/RotateScanline.htm。
    你也可以下载RotateScanline.zip。
    在李兰友等编写的《Visual Basic绘图与图象处理》(人民邮电出版社,ISBN7-115-07934-X)或《VISUAL BASIC 6 图像处理开发与实例》介绍了旋转的原理,但如果使用VB处理太慢了,不可行。 
      

  5.   

    我大概说一下
    对于整90的旋转,不会造成图象损失(这里不考虑矢量图)
    其它角度处理起来就有问题(会造成图象损失,由于象素的原因)有一种方法是计算原始点的位置得出当前值
    总之没有现成的API供你用:)---------------------
    但如果使用VB处理太慢了,不可行
    -------------------
    ....