2.Web动画图像分解方法
从Web网页上下载静态图像文件比较简单,下载后需要进行分解。 动画
图像文件的分解是动画设计的逆过程,即把一个动画效果的图像文件分解形
成它的多幅图片文件。可使用GIF Construction Set软件打开(此软件可在
许多服务器上下载)要分解的图像文件,该软件即可将动画自动分解为多幅
组成动画的单幅图画。 使用上述软件分解后,首先看看是由几幅图画组成
的动画,如果有N幅图画,就把动画文件拷贝N份。 然后,逐个打开拷贝文
件对每个文件进行处理,处理过程中只需在第一个文件中保留静止的图像,
在其它文件中只保留动画图像。 最后,使用具有图形转换功能的图形处理
软件如Phtoshop,就可把得到的N个*.Gif图像文件都转换成*.Bmp文件的格
式。Web动画分解过程概括描述如下: Web动画下载→Web动画分解(GIF
Construction Set)→Web动画格式转换(Phtoshop等)。
*一个实例*
这是一个在数据库查询窗体上设计的眼睛转动查看的动画,此动画的
每个单幅图画就是从Web网页上下载分解得到的。 动画设计实现步骤如下:
首先,用上述方法把Web网页上转眼睛动画下载保存、分解、格式转换成二
幅画Eyesl.Bmp和Eyes2.Bmp(此动画简单,只由二幅画组成)。 其次,将
Eyes1.Bmp和Eyes2.Bmp放入图像控制数组中。 窗体构造简单表示如下:
窗体属性表如下:
程序代码如下:
在窗体的General中声明:
Dim Rotateflag as Integer '交替显示标志
Dim Currenteyes as Integer '当前显示第几幅画
窗体装载初始化:
Sub Form_Load() Rotateflag=1 '进入显示(时钟计数开始)
Currenteyes=0 '第一幅画定位
End Sub
交替显示子程序(时钟控制显示间隔,本例为250ms):
Sub Tmrtimer_Timer()
If Rotateflag=1 Then '交替显示开始
SImgeyes.Picture=Imgeyes(Currenteyes).Picture '开始显示第一幅画
Currenteyes=Currenteyes+1 '250ms后显示下一幅
If Currenteyes=2 Then Currenteyes=0 '如果已显示了两幅,则再从第
一幅显示
End If
End If
End Sub '结束
利用Web网页动画图像分解成的多个单幅图画,不但可以为VB动画设计
提供方便,也可用于VC等动画编程。目前,Internet的范围日益扩大,使
Web与软件编程联系起来,无疑提高了应用软件的制作效率和质量。
三、VB实现图像艺术清屏程序部分关键代码
其中t1-t7.bmp均为320*200*256C分辨率的BMP文件。
Private Sub Form-Load()
Form1.Caption = ″电脑艺术趣味清屏″
′将两图形控件重合放置,Picture1(0)在下,Picure1(1)在上
′Picture1(0)完全被Picure1(1)遮住
Form1.Picture1(0).AutoRedraw = True
Form1.Picture1(0).AutoSize = False
Form1.Picture1(1).AutoRedraw = True
Form1.Picture1(1).AutoSize = False
Form1.Picture1(0).Left = Form1.Picture1(1).Left
Form1.Picture1(0).Top = Form1.Picture1(1).Top
Form1.Picture1(0).Width = Form1.Picture1(1).Width
Form1.Picture1(0).Height = Form1.Picture1(1).Height
EndSub
Private Sub Command1_Click()
′将图形文件装入Picture1控件Picture属性中,注意图wqje文件所在的路径
Form1.Picture1(0).Picture = LoadPicture(″e:\3ds4\images\t1.bmp″)
Form1.Picture1(1).Picture = LoadPicture(″e:\3ds4\images\t3.bmp″)
′记录下图像的宽度w1和高度h1
w1 = Form1.Picture1(1).Width
h1 = Form1.Picture1(1).Height
′Picture1(1).Picture由不可见状态,从左向右拉开形成图形清屏效果
Form1.Picture1(1).Height = h1
Form1.Picture1(1).Width = 0
For i = 0 To 50
Form1.Picture1(1).Width = i * w1 / 50
Next i
′当Picture1(1).Picture完全遮住Picture1(0).Picture时,换Picture1
(0).Picture图
Form1.Picture1(0).Picture = LoadPicture("e:\3ds4\images\t4.bmp"
′Picture1(1)?Picture从右向左折叠,露出Form1.Picture1(0).Picture
图形
For i = 0 To 50
Form1.Picture1(1).Width = w1 - i * w1 / 50
Next i
′Picture1(1).Picture为不可见状态时,换图再次从左向右拉开形成图形
清屏效果
Form1.Picture1(1).Picture = LoadPicture(″e:3ds4\images\t5.bmp″)
Form1.Picture1(1).Width = 0
For i = 0 To 50 ′step w1/50′
Form1.Picture1(1).Width = i * w1 / 50
Next i
′当Picture1(1).Picture完全遮住Picture1(0).Picture时,再次换 Picture1(0).Picture图
Form1.Picture1(0).Picture = LoadPicture(″e:\3ds4\images\t7.bmp″)
′当Picture1(1).Picture从下向上折叠,露出Form1.Picture1(0).Picture图形
Form1.Picture1(1).Height = h1
For i = 0 To 50
Form1.Picture1(1).Height = h1 - i * h1 / 50
Next i
′当Picture1(1).Picture为不可见状态时,换图再次从上向下拉开形成图形
清屏效果。
Form1.Picture1(1).Picture = LoadPicture(″e:3ds4\images\t6.bmp″)
For i = 0 To 50
Form1.Picture1(1).Height = i * h1 / 50
Next i
End Sub
Private Sub Command2_Click()
End
End Sub
在用VB编制绘图程序时,有时需要将窗体或图片框上的绘图结果
形成一个定制的图形文件保存起来,以便以后浏览或修改。这一功能
可以用VB本身带有的SavePicture语句来完成。
SavePicture语句将窗体、图象控件或图片框中的图形图象保存
到磁盘上的一个文件中,这些图象可以是使用画图方法(Line,Circle,
Pset)设计出来的,也可以存储那些通过设置窗体或图片框的图片属
性或者通过PaintPicture方法或Load?Picture函数载入的图象。这
些载入的图象可以是BMP、ICO或WMF图形文件。
SavePicture语句的语法格式如下:
SavePicture picture,stringexpression,参数picture为窗
体或图片框的picture或image属性;
参数strngexpression为保存的文件名。
下面举一个具体的程序来说明定制图象文件的过程:
1 创建一个新的项目文件,在Forml中加入一个图象控件Picturel,
将Picture1的AutoRedraw属性设置为True。
2.在Form-Load()事件中,加入如下代码:
Private Sub Form-Load()
Dim CX As Integer
Dim CY As Integer
Dim Limit As Integer
Dim Radius As Integer
CX=1000
CY=1000
For Radius=0 To Limit
Picturel.Circle(CX,CY),Radius,RGB(Rnd* 255,Rnd* 255,
Rnd*255)
Next Radius
SavePicture Picturel.Image,"c:\custom.bmp"
End Sub
执行此程序就会把图片框Picturel上的图象保存在C盘根目录下custom.
bmp图象文件中。
最后有两点需要指出:
1.在使用SavePicture语句之前,必须先将窗体或图片框的AutoRedraw
属性设为True,否则保留的将是一张空图。
2.使用Image属性保存的用画图命令(如Line,Cirele,Pset或Print)
画出来的图形总是以BMP文件格式保存。但在程序设计时如果使用窗体或图片
框的Picture属性载入或在程序运行时通过LoadPicture函数载入的图象,使
用SavePicture语句存储时,存储的文件格式同其载入前的文件格式一样
(如ICO格式等)。
closewings
picture
bfly2
命令框 name
command1
caption
E&xit
定时器 name
timer1
interval
200
有关程序比较简单,代码如下:
定时器中断程序:
Private SubTimer-Timer()
Static PickBmp As Integer
Main.Move Main.Left +20,Main.Top -5
If PickBmp Then
Main.Picture =Open Wings.Picture’Displays the open butterfly
picture.
Else
Main.Picture =Close Wings.Picture’Displays the closed butterfly
picture.
End If
PickBmp=Not PickBmp’Toggle the value.
End Sub
退出按钮(exit)程序:
Private Sub Command1-Click()
Unload Me
End
End Sub
这样,利用VB的move方法和其它对象属性,就可以实现更加复杂的动画
设计。
VB中实现图像特技的一种方法
在多媒体程序设计中,为了美化显示屏幕,增加画面的动感,常常要用
天各种图像显示特技。图像的切换技术能明显美化画面。用Visual Basic编
制这类程序时,由于VB自身没有这种切换功能,因此需要利用第三方控件或
调用W indowsAPI函数BitBlt来实现这种功能。本文介绍用BitBlt函数实现
画面的各种切换方法,供大家参考。
假设有5个图像文件(Picture1-Picture5),我们的目标是让这5幅画
自动地循环显示,每幅画以某种切换方式出现,当有击鼠标动作时退出程序。
1 创建项目文件:
运行VB,建立一个新工程文件Project1,加入一个新的Form名称为Form1,
和一个模块文件Modull,在Form1中加入一个图画框Picture1和一个定时器Timer1。
设置各控件的属性如下:
Form1:AutoRedraw:True
ScaleMode:3
Picture1:AutoRedraw:True
ScaleMode:3
Visible:False
2 代码编写
Modull.bas中的内容(声明BitBlt函数):
Public Const SRCCOPY=&HCC0020’(DWORD)dest=source
Declare Function BitBlt Lib "gdi32"Alias "BitBlt"(By Val hDestDC
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 dwRop As Long ) As Long
这两句只要从Win32api.txt文件中粘贴即可。
Form1中的代码:
在Declare中定义全局变量:
Const bmpfilemax=5&总共5个bmp文件
Dim bmpfile(bmpfilemax)As String&bmp 文件的文件名数组
Dim drawbmpmode(bmpfilemax) As Integer&各画显示时的切换方式
Dim bmpnum,movestep,xmax,ymax As Integer
Dim kxy As Single &x,y二个方向的比例
程序运行时先作初始化工作:
Private Sub Form-Load ()
bmpnum=0 &当前文件号=0,第一个文件
bmpfile(0)=App.Path+''\bmp1.bmp'' bmpfile(1)=App.Path+''\bmp2.bmp''
bmpfile(2)=App.Path+''\bmp3.bmp''
bmpfile(3)=App.Path+''\bmp4.bmp''
bmpfile(4)=App.Path+''\bmp5.bmp''
drawbmpmode(0)=1
drawbmpmode(1)=5
drawbmpmode(2)=3
drawbmpmode(3)=4
drawbmpmode(4)=2
movestep=0 &步进参数
xmax=Form.ScaleWidth/2
ymax=Form.ScaleHeight/2
kxy =ymax/xmax
Picture1.Picture=LoadPicture(bmpfile(bmpnum))
Timer1.Interval=30 &定时器起动
End Sub
响应鼠标:
Private Sub Form-Click ()
End &当有击鼠标动作时程序结束
End Sub
切换演示工作主要在定时器中完成:
Private Sub Timer1-Timer ()
hDestDC=Form1.HDC&目标DC
hSrcDC=Picture1.hDC&源DC,画是从不可见的Picture1中拷贝到窗体
drawflag =drawbmpmode(bmpnum)&当前画出现的方式
Select Case drawflag
Case 1 &从中间逐步放大
endmax=xmax&用于结束判断
X1=xmax-movestep
w=movestep*2
Y1=Cint(ymax-movestep*kxy)
h=Cint(2*movestep*kxy)
i=BitBlt(hDestDC,X1,Y1,w,h,hSrcDC,X1,Y1,SRCCOPY)
Case 2 &从左到右
endmax=xmax
w=movestep*2
h=Form1.ScaleHeight
i=BitBlt(hDestDC,0,0,w,h,hSrcDC,X1,Y1,SRCCOPY)
Case 3 &左右向中间
endmax=xmax
w=movestep
h=Form1.ScaleHeight
i=BitBlt(hDestDC,0,0,w,h,hSrcDC,0,0,SRCCOPY) &左面部分
X1= Form1.ScaleWidth-movestep
i=BitBlt(hDestDC,X1,0,w,h,hSrcDC,X1,0,SRCCOPY) &左面部分
Case 4 &栅条状
endmax=CInt(2*xmax/10) &共分阶10条
tempi=CInt(2*xmax/10)
w=movestep
h=Form1.ScaleHeight
For ij=0 To 9
i=BitBlt(hDestDC,tempi*ij,0,w,h,hSrcDC,tempi*ij,0,SRCCOPY)
Next ij
Case 5 &棱形状
endmax=CInt(2*xmax/10)
tempi=CInt(2*xmax/10)
w=movestep
For ih=0 To w-1
For ik=0 To 9
For ij=0 To 9
l=tempi*ik+tempi/2
t=tempi*ij+tempi/2
i=BitBlt(hDestDC,1-(w-ih),t-ih,(w-ih)*2,1,hSrcDC,1-(w-ih),
t-ih, SRCCOPY)
i=BitBlt(hDestDC,1-(w-ih),t+ih,(w-ih)*2,1,hSrcDC,1-(w-ih),
t+ih, SRCCOPY)
Next ij
Next ik
Next ih
End Select
Form1.Refresh
movestep=movestep+2 &步进增加
If movestep>endmax Then&若步进够大,画面都已显示,本张画结束
切换
bmpnum=bmpnum+1 &进到下一张画
If bmpnum>=bmpfilemax Then&若5张画已显示完则再从第一张开始
bmpnum=0
End If
movestep=0
Picture1.Picture=LoadPicture(bmpfile(bmpnum))
End If
End Sub
放置“透明”的图片
在 VB 中,如果你试着把一只有鸟的图片放到背景的一棵树上,
你就会发现树会被鸟遮住一个矩形的区域(即鸟的图片矩形)。我们
可以通过以下方法使图片上非鸟的其它部分变透明:
我们可以利用一个 WinAPI 函数 BitBlt 对图形进行一系列的位
操作来达到此目的。
函数声明:
Declare Function BitBlt Lib "gdi32" Alias "BitBlt"
(ByVal hDestDC 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 dwRop
As Long) As Long
参数解释:
目标环境:hDestDC——目标设备环境;x——左上角;y——顶端;
nWidth——宽;nHeight——高
源环境:hSrcDC——源设备环境;xSrc——源左上角;ySrc——源
顶端;
dwRop——位处理操作,如 vbSrcAnd;vbSrcAnd;vbSrcCopy;
vbSrcErase;vbSrcInvert 等
(目标环境或源环境只能是 Picture, Form 或 Printer 对象。
各单位为象素。)
进行处理之前,我们需要对鸟的图片进行处理:先复制一份相同的
图形,将其应该透明之处(鸟的背景)设置为黑色(设此图为sPic),
再将另一图做以下处理:要复制的地方(鸟)设置为黑色,其余地方设
置(鸟的背景)为白色(设此图为Mask)。设树的图形为名dPic。
最后,请加入以下代码:
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,Mask.hdc,
0,0,vbScrCopy)
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,sPic.hdc,
0,0,vbScrInvert)
后记:
1、VB 中的 PaintPicture 方法提供类似功能,但速度不及此方法。
2、在此方法上稍微加入一些代码,就不难实现动画的显示。
3、VB 例子中的 CallDlls 就使用此方法。
播放 AVI
声明:
Declare Function mciSendString Lib "winmm.dll" Alias _
"mciSendStringA" (ByVal lpstrCommand As String, ByVal _
lpstrReturnString As String, ByVal uReturnLength _
As Long, ByVal hwndCallback As Long) As Long
代码:
Dim returnstring As String
FileName As String
returnstring = Space(127)
FileName = "C:\A1.avi"
erg = mciSendString("open " & Chr$(34) & FileName &
Chr$(34) & " type avivideo alias video", returnstring,
127, 0)
erg = mciSendString("set video time format ms",
returnstring, 127, 0)
erg = mciSendString("play video from 0", returnstring,
127, 0)
'记着关闭!
erg = mciSendString("close video", returnstring, 127, 0)
捕捉屏幕图象
声明:
Private Declare Function ReleaseDC Lib "user32" (ByVal
hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal
hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32"
(ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal
hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As
Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC
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 dwRop As Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA"
(ByVal lpDriverName As String, ByVal lpDeviceName As String,
ByVal lpOutput As String, lpInitData As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32"
(ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32"
(ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight
As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
函数:
Sub ScrnCap(Lt, Top, Rt, Bot)
rWidth = Rt - Lt
rHeight = Bot - Top
SourceDC = CreateDC("DISPLAY", 0, 0, 0)
DestDC = CreateCompatibleDC(SourceDC)
BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
SelectObject DestDC, BHandle
BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, Lt, Top,
&HCC0020
Wnd = Screen.ActiveForm.hwnd
OpenClipboard Wnd
EmptyClipboard
SetClipboardData 2, BHandle
CloseClipboard
DeleteDC DestDC
ReleaseDC DHandle, SourceDC
End Sub
以下的示例把屏幕图象捕捉后,放到Picture1 中。
Sub Command1_Click()
Form1.Visible = False
ScrnCap 0, 0, 640, 480
Form1.Visible = True
picture1 = Clipboard.GetData()
End Sub
Re:【转帖】VB6.0中多媒体的编程技巧(一)