引用ActiveMovie Control Type Library,用下面的代码在2000,XP能实现载图但在98中出错,经查找可能是出现在quartz.dll版本的问题上,但在98不能引用2000,XP中的quartz.dll,那位大侠能帮我修改一下程序,或者还有什么别的方法能在98中实现视频截图
'ActiveMovie技术下的多媒体控制器
Public Movie1 As FilgraphManager
Public Video1 As IBasicVideo2
Public Sound1 As IBasicAudio
Public Windows1 As IVideoWindow
Public Position1 As IMediaPosition
Public MovieEvent1 As IMediaEventEx
Private Sub Command1_Click()
'截图
Captch "c:\1.bmp"
End SubPrivate Sub Captch(ByVal fileName As String)
'截图' Call Video1.GetCurrentImage(lngLength, ByVal 0&)
' ReDim bytImage(0& To lngLength - 1&) As Byte
' lngPointer = VarPtr(bytImage(0&))
' Call objVideo.GetCurrentImage(lngLength, lngPointer)
'得到高/宽
Dim vx As Long, vy As Long
vy = Video1.VideoHeight
vx = Video1.VideoWidth
'暂停一下
Movie1.Pause
'得到图象数据
'先是40个字节的DIB头
'然后就是长*宽*4字节的数据
Dim sz As Long
Dim img() As Long
sz = vx * vy + 10
ReDim img(sz - 1)
Video1.GetCurrentImage sz * 4, img(0)
'保存位置 '如果是图片格式未知
If (img(0) <> 40) Or (img(3) <> &H200001) Then
MsgBox "未知的格式!"
GoTo goOnPlay
End If
'设置图象框大小
With Me.PicSave
.Visible = True
.Height = vy
.Width = vx
End With
'取得图象数据
Dim x As Long, y As Long
Dim col As Long, rr As Long, gg As Long, bb As Long
Dim pp As Long
pp = 10
'数据的格式是从下到上,从左到右的方式
For y = 0 To vy - 1
For x = 0 To vx - 1
col = img(pp)
bb = col And 255&
gg = (col \ 256&) And 255&
rr = (col \ 65536) And 255&
col = RGB(rr, gg, bb)
'输出到图片框中去
Me.PicSave.PSet (x, vy - y), col
pp = pp + 1
Next
Next
'保存图片
SavePicture PicSave.Image, fileName
goOnPlay:
'继续
Movie1.Run
End SubPrivate Sub MenuOpen_Click() '打开文件
Me.OpenFile.fileName = ""
Me.OpenFile.ShowOpen
If Me.OpenFile.fileName = "" Then
Exit Sub
End If
'播放文件
Call PlayMovie(Me.OpenFile.fileName)
End SubPrivate Sub PlayMovie(strFile As String)
'播放当前文件 On Error GoTo error1
'准备开始播放
'初始化控制器
Set Position1 = Nothing
Set Windows1 = Nothing
Set Sound1 = Nothing
Set Video1 = Nothing
Set Movie1 = Nothing
Set Movie1 = New FilgraphManager
Set Video1 = Movie1
Set Sound1 = Movie1
Set Windows1 = Movie1
Set Position1 = Movie1
Set MovieEvent1 = Movie1 '载入文件
Movie1.RenderFile strFile
'则初始化窗口
Windows1.Owner = Form2.MovieScreen.hWnd
Windows1.MessageDrain = Form2.MovieScreen.hWnd
movieHwnd = Me.hWnd
MovieEvent1.SetNotifyWindow Me.hWnd, MOVIE_EVENT, 0
Windows1.Top = 0
Windows1.Left = 0
Windows1.WindowStyle = &H560B0000
'初始化各个窗口和图象大小
Form2.MovieScreen.Width = Video1.VideoWidth
Form2.MovieScreen.Height = Video1.VideoHeight
Form2.ScaleMode = 1
Form2.Width = Form2.MovieScreen.Width
Form2.Height = Form2.MovieScreen.Height
Form2.ScaleMode = 3
Form2.Visible = True
'开始播放
Movie1.Run Exit Sub
error1:
'出错处理
Set MovieEvent1 = Nothing
Set Position1 = Nothing
Set Windows1 = Nothing
Set Sound1 = Nothing
Set Video1 = Nothing
Set Movie1 = Nothing
Form2.Visible = False
MsgBox "不支持的文件格式....."End Sub
'ActiveMovie技术下的多媒体控制器
Public Movie1 As FilgraphManager
Public Video1 As IBasicVideo2
Public Sound1 As IBasicAudio
Public Windows1 As IVideoWindow
Public Position1 As IMediaPosition
Public MovieEvent1 As IMediaEventEx
Private Sub Command1_Click()
'截图
Captch "c:\1.bmp"
End SubPrivate Sub Captch(ByVal fileName As String)
'截图' Call Video1.GetCurrentImage(lngLength, ByVal 0&)
' ReDim bytImage(0& To lngLength - 1&) As Byte
' lngPointer = VarPtr(bytImage(0&))
' Call objVideo.GetCurrentImage(lngLength, lngPointer)
'得到高/宽
Dim vx As Long, vy As Long
vy = Video1.VideoHeight
vx = Video1.VideoWidth
'暂停一下
Movie1.Pause
'得到图象数据
'先是40个字节的DIB头
'然后就是长*宽*4字节的数据
Dim sz As Long
Dim img() As Long
sz = vx * vy + 10
ReDim img(sz - 1)
Video1.GetCurrentImage sz * 4, img(0)
'保存位置 '如果是图片格式未知
If (img(0) <> 40) Or (img(3) <> &H200001) Then
MsgBox "未知的格式!"
GoTo goOnPlay
End If
'设置图象框大小
With Me.PicSave
.Visible = True
.Height = vy
.Width = vx
End With
'取得图象数据
Dim x As Long, y As Long
Dim col As Long, rr As Long, gg As Long, bb As Long
Dim pp As Long
pp = 10
'数据的格式是从下到上,从左到右的方式
For y = 0 To vy - 1
For x = 0 To vx - 1
col = img(pp)
bb = col And 255&
gg = (col \ 256&) And 255&
rr = (col \ 65536) And 255&
col = RGB(rr, gg, bb)
'输出到图片框中去
Me.PicSave.PSet (x, vy - y), col
pp = pp + 1
Next
Next
'保存图片
SavePicture PicSave.Image, fileName
goOnPlay:
'继续
Movie1.Run
End SubPrivate Sub MenuOpen_Click() '打开文件
Me.OpenFile.fileName = ""
Me.OpenFile.ShowOpen
If Me.OpenFile.fileName = "" Then
Exit Sub
End If
'播放文件
Call PlayMovie(Me.OpenFile.fileName)
End SubPrivate Sub PlayMovie(strFile As String)
'播放当前文件 On Error GoTo error1
'准备开始播放
'初始化控制器
Set Position1 = Nothing
Set Windows1 = Nothing
Set Sound1 = Nothing
Set Video1 = Nothing
Set Movie1 = Nothing
Set Movie1 = New FilgraphManager
Set Video1 = Movie1
Set Sound1 = Movie1
Set Windows1 = Movie1
Set Position1 = Movie1
Set MovieEvent1 = Movie1 '载入文件
Movie1.RenderFile strFile
'则初始化窗口
Windows1.Owner = Form2.MovieScreen.hWnd
Windows1.MessageDrain = Form2.MovieScreen.hWnd
movieHwnd = Me.hWnd
MovieEvent1.SetNotifyWindow Me.hWnd, MOVIE_EVENT, 0
Windows1.Top = 0
Windows1.Left = 0
Windows1.WindowStyle = &H560B0000
'初始化各个窗口和图象大小
Form2.MovieScreen.Width = Video1.VideoWidth
Form2.MovieScreen.Height = Video1.VideoHeight
Form2.ScaleMode = 1
Form2.Width = Form2.MovieScreen.Width
Form2.Height = Form2.MovieScreen.Height
Form2.ScaleMode = 3
Form2.Visible = True
'开始播放
Movie1.Run Exit Sub
error1:
'出错处理
Set MovieEvent1 = Nothing
Set Position1 = Nothing
Set Windows1 = Nothing
Set Sound1 = Nothing
Set Video1 = Nothing
Set Movie1 = Nothing
Form2.Visible = False
MsgBox "不支持的文件格式....."End Sub
解决方案 »
- word录制打印宏的问题
- pc向手机发短信问题???
- 如何使正在执行的EXE文件接收外部参数
- 求助DATALIST的刷新问题……
- ===========如何利用VB实现文件夹监视的功能===============(100分)
- VB 和 SQL Server 问题。 在线等待中。。。。。谢了!
- 数据库查询问题,在线等待中.......
- 麻烦解释一下split()函数的用法,及其有关winsocks的一般用法!谢谢!
- 我这儿有一个ACCESS的仓库管理系统的源代码,但是运行总出错,能不能麻烦各位大虾给改一下
- 如何实现预览?
- 请给一个能在vb里提交论坛发言的代码?
- 我申请COM/DCOM/COM+版版主,多谢支持!
SetDIBitsToDevice VB声明
Declare Function SetDIBitsToDevice Lib "gdi32" Alias "SetDIBitsToDevice" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
说明
将一幅与设备无关位图的全部或部分数据直接复制到一个设备。这个函数在设备中定义了一个目标矩形,以便接收位图数据。它也在DIB中定义了一个源矩形,以便从中提取数据
返回值
Long,执行成功则返回扫描线的数量,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,一个设备场景的句柄。该场景用于接收位图数据
x,y Long,用逻辑坐标表示的目标矩形的起点
dx,dy Long,用目标矩形的设备单位表示的宽度及高度
SrcX,SrcY Long,用设备坐标表示的源矩形在DIB中的起点
Scan Long,Bits数组中第一条扫描线的编号。如BitsInfo之BITMAPINFOHEADER部分的biHeight字段是正数,那么这条扫描线就会从位图的底部开始计算;如果是负数,就从顶部开始计算
NumScans Long,欲复制的扫描线数量
Bits Any,指向一个缓冲区的指针。这个缓冲区包含了以DIB格式描述的位图数据;这种格式是由BitsInfo指定的
BitsInfo BITMAPINFO,对Bits DIB的格式和颜色进行描述的一个结构
wUsage Long,下述常数之一
DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hdc设备场景的调色板相关的索引
DIB_RGB_COLORS 颜色表包含了RG颜色
注解
用GetDeviceCaps判断设备是否支持这个函数