none
擷取某物件上的畫面並做像處理 RRS feed

  • 問題

  • 請問
    假使我要截取出AxShockwaveFlash物件上的畫面 可是在這個物件上面我有覆蓋東西在上面
    但是我擷取出來畫面不要有覆蓋的這個東西 要如何取得

    當我取得後需要再做一些簡單的影像判斷
    就是判斷當擷取的影像中有由某個RGB所組成的顏色存在時
    就將這些顏色保留 其他地方塗黑
    畫面擷取部份我在其他地方有大大 介紹使用Graphics.CopyFromScreen 的方式 可是這會ㄧ起將我覆蓋的東西都擷取下來
    但我只要單純AxShockwaveFlash物件上的影像就好

    另外 也有人介紹使用DrawToBitmap 寫法如下 但其他物件可以成功 用在AxShockwaveFlash上就不行
    所以請問還有其它方式嗎

     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

            Dim g As Graphics = Me.AxShockwaveFlash1.CreateGraphics
            Dim ibitMap As New Bitmap(Me.AxShockwaveFlash1.ClientSize.Width, Me.AxShockwaveFlash1.ClientSize.Height, g)
            Dim DataGridViewRectangle As New  _
              Rectangle(Me.AxShockwaveFlash1.ClientRectangle.X, _
                        Me.AxShockwaveFlash1.ClientRectangle.Y, _
                        Me.AxShockwaveFlash1.ClientSize.Width, _
                        Me.AxShockwaveFlash1.ClientSize.Height)
            Me.AxShockwaveFlash1.DrawToBitmap(ibitMap, DataGridViewRectangle)
            PictureBox7.Image = ibitMap
           

        End Sub

    謝謝


    MIT
    2009年4月20日 上午 01:49

解答

所有回覆

  • 針對 AxShockwaveFlash1 的 hWnd 來做畫面擷取。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年4月20日 上午 06:13
  • 所以還是使用DrawToBitmap嗎?
    因為我對這部份比較沒有經驗
    怎樣才能對AxShockwaveFlash1 的 handle window做畫面擷取
    感謝 
    MIT
    2009年4月20日 上午 06:33
  • 前置人工作業:
    0. 先用 spy++ 看 AxShockwaveFlash1 的 TitleName 跟 ClassName

    程式碼作業:
    1. 用 API FindWindowEx 在 Me.Handle 找上面的 TitleName / ClassName ,取得 hWnd
    2. 針對你要輸出的目標用 Graphics.GetHdc 取得目標畫布
    3. 用 API GetWindowDC 取得 hWnd 的來源畫布
    4. 用 API GetWindowSize 取得要擷取的範圍大小
    5. 用 API BitBlt 將來源畫布的內容畫到目標畫布


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年4月20日 上午 09:22
  • 你好
    我在SPY++的窗口 看到有個窗口是Form1~WindowsForms10.Window.8.app.0.3b95145然後底下有個MacromediaFlashPlayerActiveX 我想應該是這個物件可是接下來我就不太清楚了
    我再第三個步驟有定義    Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" ( _
        ByVal hwnd As Long _
        ) As Long

    可是其他的就不知道要怎麼用了

    只有這種方式嗎
    MIT
    2009年4月21日 上午 08:29
  • 這個方式是通用方式,除 DirectX 架構下的視窗外 (含 Media Player) ,都抓得到。

    還有,你把 VBNET 跟 VB6 的宣告混在一起了。

    你可以看看這篇下方的基本條件,有部分的原始碼可參考:
    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=25&Function=202


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年4月21日 上午 09:08
  • 謝謝
    可是我在您的連結文件中看到這句
    //本函數並未特別處理滑鼠游標,故擷取之圖片不含游標,游標要另外擷取疊加,此外,擷取表單畫面時,若該表單有其他視窗疊在上方,將顯示最上方之畫面,而非完整表單畫面。//
    這樣是不是會把我覆蓋在AxShockwaveFlash的東西都擷取下來 我只要單純AxShockwaveFlash物件上的影像就好
    我之前有用過下面的方式 就會有上述的情形
    Dim s As Size = Me.Size
            memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
            Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
            memoryGraphics.CopyFromScreen(Me.Width / 2, Me.Height / 3, 20, 20, s)
            PictureBox7.Image = memoryImage

    MIT
    2009年4月21日 上午 10:19
  • Windows 在非作用中的視窗,其更新內容可能會被忽略,這是作業系統的因素。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年4月21日 上午 10:35
  • 那請問我到底能怎樣擷取出AxShockwaveFlash物件上的影像
    您有範例可以參考嗎 我試了很久還是用不出來
    有點急 THX


    MIT
    2009年4月21日 上午 10:52
  • 請問寫法如下仍然會擷取到覆蓋在AxShockwaveFlash1上的物件  









    Private Declare Auto Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal _ nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc _ As Integer, ByVal nYSrc As Integer, ByVal dwRop As System.Int32) As Boolean Private Const SRCCOPY As Integer = &HCC0020 Declare Function GetWindowDC Lib "user32" (ByVal hwnd As IntPtr) As IntPtr Private Function GetDecoratedFormImage() As Bitmap ' Get this form's Graphics object. Dim MyGrph As Graphics = Me.AxShockwaveFlash1.CreateGraphics ' Make a Bitmap to hold the image. Dim TempBMP As New Bitmap(Me.AxShockwaveFlash1.Width, Me.AxShockwaveFlash1.Height, MyGrph) Dim MyGrphBmp As Graphics = MyGrph.FromImage(TempBMP) Dim MyGrphBmpHdc As IntPtr = MyGrphBmp.GetHdc ' Get the form's hDC. We must do this after ' creating the new Bitmap, which uses me_gr. Dim MyGrphHdc As IntPtr = GetWindowDC(Me.AxShockwaveFlash1.Handle) ' BitBlt the form's image onto the Bitmap. BitBlt(MyGrphBmpHdc, 0, 0, Me.Width, Me.Height, MyGrphHdc, 0, 0, SRCCOPY) MyGrphBmp.ReleaseHdc(MyGrphBmpHdc) ' Return the result. Return TempBMP End Function

    MIT
    2009年4月27日 上午 01:32
  • 前面回過:
    Windows 在非作用中的視窗,其更新內容可能會被忽略,這是作業系統的因素。

    所以用 Spy++ 找到前景的 hWnd 後,用 API ShowWindow(SW_HIDE) 把那個前景視窗隱藏掉,讓在下方的 ocx 能夠完整顯示。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年4月27日 上午 02:14
  • 不好意思~! 可能是我說的不清楚
    我是指在VB FORM設計時 我會在AxShockwaveFlash1上蓋上三個黑色的Picturebox
    但我擷取AxShockwaveFlash1時不要抓到這三個黑色的Picturebox
    只要單純的AxShockwaveFlash1畫面而已

    感謝
    MIT
    2009年4月27日 上午 02:53
  • 請問要像上面的功能有辦法達成嗎??
    感謝
    MIT
    2009年4月27日 上午 09:42