vb.net 怎么用directshow实现抓图啊?

meimei270 2008-08-04 09:33:04
和题目一样,麻烦给段代码,抓图后能把图保存起来的
跪求感谢了啊~!
...全文
259 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanlongwuhui 2008-08-05
  • 打赏
  • 举报
回复
directshow不会用,跟楼上一样用API函数倒是实现过
LYDF4151 2008-08-05
  • 打赏
  • 举报
回复
VB2003
Public Class Form3

Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()

MyBase.New()

'该调用是 Windows 窗体设计器所必需的。

InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub

'窗体重写处置以清理组件列表。

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub

'Windows 窗体设计器所必需的

Private components As System.ComponentModel.IContainer

'注意:以下过程是 Windows 窗体设计器所必需的

'可以使用 Windows 窗体设计器修改此过程。

'不要使用代码编辑器修改它。

Friend WithEvents Button1 As System.Windows.Forms.Button

Friend WithEvents Timer1 As System.Windows.Forms.Timer

Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox

Friend WithEvents Button2 As System.Windows.Forms.Button

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

Me.components = New System.ComponentModel.Container

Me.Button1 = New System.Windows.Forms.Button

Me.Timer1 = New System.Windows.Forms.Timer(Me.components)

Me.PictureBox1 = New System.Windows.Forms.PictureBox

Me.Button2 = New System.Windows.Forms.Button

Me.SuspendLayout()

'

'Button1

'

Me.Button1.ForeColor = System.Drawing.Color.Black

Me.Button1.Location = New System.Drawing.Point(8, 312)

Me.Button1.Name = "Button1"

Me.Button1.Size = New System.Drawing.Size(112, 32)

Me.Button1.TabIndex = 0

Me.Button1.Text = "抓屏"

'

'PictureBox1

'

Me.PictureBox1.Location = New System.Drawing.Point(8, 8)

Me.PictureBox1.Name = "PictureBox1"

Me.PictureBox1.Size = New System.Drawing.Size(392, 288)

Me.PictureBox1.TabIndex = 4

Me.PictureBox1.TabStop = False

'

'Button2

'

Me.Button2.ForeColor = System.Drawing.Color.Black

Me.Button2.Location = New System.Drawing.Point(264, 312)

Me.Button2.Name = "Button2"

Me.Button2.Size = New System.Drawing.Size(112, 32)

Me.Button2.TabIndex = 5

Me.Button2.Text = "保存"

'

'Form1

'

Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)

Me.BackColor = System.Drawing.Color.FromArgb(CType(192, Byte), CType(192, Byte), CType(255, Byte))

Me.ClientSize = New System.Drawing.Size(408, 358)


Me.Controls.Add(Me.Button2)

Me.Controls.Add(Me.PictureBox1)

Me.Controls.Add(Me.Button1)

Me.ForeColor = System.Drawing.Color.FromArgb(CType(192, Byte), CType(255, Byte), CType(255, Byte))

Me.Name = "Form1"

Me.Text = "wgscd"

Me.ResumeLayout(False)

End Sub

#End Region

'VB.NET中进行图象捕获 ,需要先引用一些API,以下是声明:

Private Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC As Integer) As Integer

Private Declare Function CreateCompatibleBitmap Lib "GDI32" (ByVal hDC As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer) As Integer

Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Integer, ByVal hObject As Integer) As Integer

Private Declare Function BitBlt Lib "GDI32" (ByVal srchDC As Integer, ByVal srcX As Integer, ByVal srcY As Integer, ByVal srcW As Integer, ByVal srcH As Integer, ByVal desthDC As Integer, ByVal destX As Integer, ByVal destY As Integer, ByVal op As Integer) As Integer



Private Declare Function DeleteDC Lib "GDI32" (ByVal hDC As Integer) As Integer

Private Declare Function DeleteObject Lib "GDI32" (ByVal hObj As Integer) As Integer

Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Integer) As Integer

Const SRCCOPY As Integer = &HCC0020

'将以下代码添加到Button1_Click事件中:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim hDC, hMDC As Integer

Dim hBMP, hBMPOld As Integer

Dim sw, sh As Integer

hDC = GetDC(0)

hMDC = CreateCompatibleDC(hDC)

sw = Screen.PrimaryScreen.Bounds.Width

sh = Screen.PrimaryScreen.Bounds.Height

hBMP = CreateCompatibleBitmap(hDC, sw, sh)

hBMPOld = SelectObject(hMDC, hBMP)

BitBlt(hMDC, 0, 0, sw, sh, hDC, 0, 0, SRCCOPY)

hBMP = SelectObject(hMDC, hBMPOld)

PictureBox1.Image = Image.FromHbitmap(New IntPtr(hBMP))

DeleteDC(hDC)

DeleteDC(hMDC)

DeleteObject(hBMP)

Me.Button2.Enabled = True

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.Button2.Enabled = False

End Sub

Dim ofd As New SaveFileDialog

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

ofd.Filter = "jpg file|*.jpg|bmp file|*.bmp"

Dim bmp As Bitmap = Me.PictureBox1.Image

If ofd.ShowDialog = DialogResult.OK Then

bmp.Save(ofd.FileName)

End If

End Sub

End Class


wood87654321 2008-08-05
  • 打赏
  • 举报
回复
VB直接建立directshow的filter是不可能的,所以想直接获得影片的Sample也很难(一直鄙视directshow对VB及托管.Net的歧视)。正解仍然是通过DrectDraw或D3D的平面将显存保存到位图。

当然,也可以站在巨人的肩膀上,使用第三方的DirectShowLibNET
Forrest23 2008-08-05
  • 打赏
  • 举报
回复
帮顶~
只在此山中 2008-08-05
  • 打赏
  • 举报
回复
以前的方法是存取显示内存,vb_dx7代码例子: http://www.applevb.com/art/ddraw_tut.htm
现在可以自己做1个filter (split),直接存取1帧图象.
yanlongwuhui 2008-08-05
  • 打赏
  • 举报
回复
道理一样的,播放影片的同时运行程序,在程序中设置个定时器,每隔一定时间间隔对屏幕抓屏一次就可以了;如果你想在需要的时候抓屏,那就让影片在你的程序内某个区域内播放,点击按钮抓图(或是设置个快捷方式触发抓图也行)
破咖啡罐子 2008-08-05
  • 打赏
  • 举报
回复
留个名,等着解决学习一下。
meimei270 2008-08-05
  • 打赏
  • 举报
回复
楼上的大哥~~可能是我的题目意思不对
我需要的是抓影片的图,不是抓屏幕的图啊

16,718

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧