[Python-es] Como capturar la pantalla con transparencias incluidas

Kiko kikocorreoso en gmail.com
Vie Oct 8 08:53:17 CEST 2010


2010/10/7 Josu Rodriguez Vilda <jrvilda en gmail.com>

> Hola a Todos,
>
>
> Necesito capturar la pantalla en Windows, solo que los intentos que he
> realizado, ninguno captura las interface transparentes como por ejemplo la
> ventana de buscar y reemplazar del notepad++.
>
> He intentado estos metodos y todos funcionan para capturar pantalla pero
> ninguno recoge las transparencias. ( no se ven las ventanas transparentes,
> como si no existiesen)
>
> from PIL import ImageGrab
> import time
>
> time.sleep(5)
> box = (100,100,400,400)
> ImageGrab.grab().crop(box).save("screen_capture.jpg", "JPEG")
>
>
> *import* Image
> *try*:
>     # built-in driver (1.1.3 and later)    grabber = Image.core.grabscreen*except* AttributeError:
>     # stand-alone driver (pil plus)    *import* _grabscreen
>     grabber = _grabscreen.grab
> ### (New in 1.1.3) Take a snapshot of the screen.  The pixels inside the# bounding box are returned as an "RGB" image.  If the bounding box is# omitted, the entire screen is copied.## @param bbox What region to copy.  Default is the entire screen.# @return An image# @since 1.1.3*def* grab(bbox=None):
>     size, data = grabber()
>     im = Image.fromstring(
>         "RGB", size, data,
>         # RGB, 32-bit line padding, origo in lower left corner        "raw", "BGR", (size[0]*3 + 3) & -4, -1
>         )
>     *if* bbox:
>         im = im.crop(bbox)
>     *return* im
> ### (New in 1.1.4) Take a snapshot of the clipboard image, if any.## @return An image, a list of filenames, or None if the clipboard does#     not contain image data or filenames.  Note that if a list is#     returned, the filenames may not represent image files.# @since 1.1.4*def* grabclipboard():
>     debug = 0 # temporary interface    data = Image.core.grabclipboard(debug)
>     *if* Image.isStringType(data):
>         *import* BmpImagePlugin, StringIO
>         *return* BmpImagePlugin.DibImageFile(StringIO.StringIO(data))
>     *return* data
>
>
>
> import win32gui,  win32ui,  win32con, win32api
>
>
>
>
>
> hwnd = win32gui.GetDesktopWindow()
>
>
> print hwnd
>
>
>
>
>
> # you can use this to capture only a specific window
>
>
> #l, t, r, b = win32gui.GetWindowRect(hwnd)
>
>
> #w = r - l
>
>
> #h = b - t
>
>
>
>
>
> # get complete virtual screen including all monitors
>
>
> SM_XVIRTUALSCREEN = 76
>
>
> SM_YVIRTUALSCREEN = 77
>
>
> SM_CXVIRTUALSCREEN = 78
>
>
> SM_CYVIRTUALSCREEN = 79
>
>
> w = vscreenwidth = win32api.GetSystemMetrics(SM_CXVIRTUALSCREEN)
>
>
> h = vscreenheigth = win32api.GetSystemMetrics(SM_CYVIRTUALSCREEN)
>
>
> l = vscreenx = win32api.GetSystemMetrics(SM_XVIRTUALSCREEN)
>
>
> t = vscreeny = win32api.GetSystemMetrics(SM_YVIRTUALSCREEN)
>
>
> r = l + w
>
>
> b = t + h
>
>
>
>
>
> print l, t, r, b, ' -> ', w, h
>
>
>
>
>
> hwndDC = win32gui.GetWindowDC(hwnd)
>
>
> mfcDC  = win32ui.CreateDCFromHandle(hwndDC)
>
>
> saveDC = mfcDC.CreateCompatibleDC()
>
>
>
>
>
> saveBitMap = win32ui.CreateBitmap()
>
>
> saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
>
>
> saveDC.SelectObject(saveBitMap)
>
>
> saveDC.BitBlt((0, 0), (w, h),  mfcDC,  (l, t),  win32con.SRCCOPY)
>
>
> saveBitMap.SaveBitmapFile(saveDC,  'screencapture.bmp')
>
>
>
>
>
>
>    1. import wx
>    2.
>    3. app = wx.PySimpleApp()
>    4.
>    5. context = wx.ScreenDC()
>    6. r, b = context.GetSize()
>    7.
>    8.
>    # i have a second monitor left of my primary, so these value are negativ
>    9. l, t = (-1280, -256) # coulfn't find a wx function to get these
>    10.
>    11. w, h = (r - l, b - t)
>    12. bitmap = wx.EmptyBitmap(w, h, -1)
>    13.
>    14. memory = wx.MemoryDC()
>    15. memory.SelectObject(bitmap)
>    16. memory.Blit(0, 0, w, h, context, l, t)
>    17. memory.SelectObject(wx.NullBitmap)
>    18.
>    19. #bitmap.SaveFile("screencapture.bmp", wx.BITMAP_TYPE_BMP)
>    20. #bitmap.SaveFile("screencapture.jpg", wx.BITMAP_TYPE_JPEG)
>    21. bitmap.SaveFile("screencapture.png", wx.BITMAP_TYPE_PNG)
>
>
>
> --
> *Josu Rodriguez Vilda*
> *
> *
>

Lo he visto en [1]
Con esto sí que parece funcionar (lo he probado con notepad++ abierto y con
la ventana buscar abierta):

>>> import sys
>>> from PyQt4.QtGui import QPixmap, QApplication
>>> app = QApplication(sys.argv)
>>>
QPixmap.grabWindow(QApplication.desktop().winId()).save('test.png','png')

pero necesitas tener instalado PyQt4.

La segunda opción que ponen en [1] no me ha funcionado y ocurre lo que tú
dices, no graba la ventana buscar de notepad++:

>>> import ImageGrab
>>> img = ImageGrab.grab()
>>> img.save('test.jpg', 'JPEG')

[1] http://es.w3support.net/index.php?db=so&id=69645
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20101008/14dfc8df/attachment.html>


Más información sobre la lista de distribución Python-es