2

ブラウザ内で実行されているアプレットのスクリーンショットを撮ろうとしています。アプレットは JOGL (OpenGL for Java) を使用して 3D モデルを表示します。(1) スクリーン ショットは常に黒または白で表示されます。現在のソリューションでは、通常の GDI 呼び出しが使用されます。OpenGL を実行していないアプレットのスクリーン ショットは問題ありません。
JOGL アプリの例をいくつかここで見つけることができますhttps://jogl-demos.dev.java.net/ (2) 私が達成しようとしているもう 1 つのことは、スクリーン ショット内にもスクロール可能な領域を取得することです。

上記の2つの問題を除いて、インターネットでこのコードを見つけました。

import win32gui as wg  
import win32ui as wu  
import win32con  

def copyBitMap(hWnd, fname):  
    wg.SetForegroundWindow(hWnd)  
    cWnd = wu.CreateWindowFromHandle(hWnd)  
    rect = cWnd.GetClientRect()  
    (x,y) = (rect[2] - rect[0], rect[3] - rect[1])  
    hsrccDc = wg.GetDC(hWnd)  
    hdestcDc = wg.CreateCompatibleDC(hsrccDc)  
    hdestcBm = wg.CreateCompatibleBitmap(hsrccDc, x, y)  
    wg.SelectObject(hdestcDc, hdestcBm.handle)  
    wg.BitBlt(hdestcDc, 0, 0, x, y, hsrccDc, rect[0], rect[1], win32con.SRCCOPY)  
    destcDc = wu.CreateDCFromHandle(hdestcDc)  
    bmp = wu.CreateBitmapFromHandle(hdestcBm.handle)  
    bmp.SaveBitmapFile(destcDc, fname)  
4

4 に答える 4

0

JOGLのScreenshotクラスを使用しないのはなぜですか?com.jogamp.opengl.util.awt.JOGL2.0ベータ版のスクリーンショット

于 2010-12-06T14:37:46.020 に答える
0

あなたがそれを自動化しようとしているのでない限り、私はこれにFirefox拡張機能を使用するでしょう。スクロール可能な領域を含むブラウザページ全体のスクリーンショットを撮ることができる「スクリーンショット」の検索から返されたそれらの数があります。

ただし、申し訳ありませんが、Pythonについて、実際にプログラムで実行しようとしている場合に特定の問題をデバッグするのに十分な知識がありません。

于 2010-02-04T22:12:21.073 に答える
0

スクリーン ショットを撮る前に dwm (デスクトップ ウィンドウ マネージャー) 構成を無効にすることでこれを行う 1 つの方法がありますが、有効/無効にするたびに画面全体が点滅します。

from ctypes import WinDLL
from time import sleep  
import win32gui as wg  
import win32ui as wu  
import win32con  

def copyBitMap(hWnd, fname):  
    dwm = WinDLL("dwmapi.dll")
    dwm.DwmEnableComposition(0)

    wg.SetForegroundWindow(hWnd)
    # Give the window sometime to redraw itself
    sleep(2)
    cWnd = wu.CreateWindowFromHandle(hWnd)
    rect = cWnd.GetClientRect()
    (x,y) = (rect[2] - rect[0], rect[3] - rect[1])
    hsrccDc = wg.GetDC(hWnd)
    hdestcDc = wg.CreateCompatibleDC(hsrccDc)
    hdestcBm = wg.CreateCompatibleBitmap(hsrccDc, x, y)
    wg.SelectObject(hdestcDc, hdestcBm.handle)
    wg.BitBlt(hdestcDc, 0, 0, x, y, hsrccDc, rect[0], rect[1], win32con.SRCCOPY)
    destcDc = wu.CreateDCFromHandle(hdestcDc)
    bmp = wu.CreateBitmapFromHandle(hdestcBm.handle)
    bmp.SaveBitmapFile(destcDc, fname)

    dwm.DwmEnableComposition(1)
于 2010-02-17T12:28:22.717 に答える
0

OpenGL は GPU によってフレーム バッファに直接レンダリングされるため、場合によっては、OpenGL ウィンドウを取得するのが非常に難しい場合があります。同じことが DirectX ウィンドウとビデオ オーバーレイ ウィンドウにも当てはまります。

于 2010-04-03T08:51:26.310 に答える