我在Picture中加载了一张图片,但是想将图片旋转一定角度显示,请问该怎么做?
解决方案 »
- user-defined type not defined错误
- 请问:ADO对象访问数据库的问题
- 如何在知道文件的handle的情况下获得文件全路径
- 如果我用vb写一个程序,然后在程序里打开一个word文档,是否可以直接调用word里的宏?
- 用winsock控件传输文件时,怎么在客户端判断文件传输完毕??
- D区精神病院VB区分院开业
- VB+MO+ARCSDE查询属性
- 那位知道 凯撒大帝III(Caesar 3)免费下载的地址(不要DEMO)??
- ★大家都关心的问题★ 请问有什么固定的硬件信息可供生成注册号码?(如获得CPU的内部ID等)
- 净化环境,呼吁灌水的人要收敛
- SQL Server 2000 中文版下载分享
- 如何实现用ftp上传两个文件?
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函数判断特定的设备场景是否支持此函数
不可选择对源位图进行剪切或旋转处理,源位图也不能是一个图元文件设备场景
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
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
还希望帮我看看!
具体的做法可以参考微软的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处理太慢了,不可行。
对于整90的旋转,不会造成图象损失(这里不考虑矢量图)
其它角度处理起来就有问题(会造成图象损失,由于象素的原因)有一种方法是计算原始点的位置得出当前值
总之没有现成的API供你用:)---------------------
但如果使用VB处理太慢了,不可行
-------------------
....