Reputation: 2431
I have code that makes a screenshot of the window using winapi. Then I have to save image to disk and load it again from disk to memory PIL. Is there any way at once without saving to disk to pass this bitmap in the PIL.
import win32gui, win32ui, win32con
import Image
win_name='Book'
bmpfilenamename='1.bmp'
hWnd = win32gui.FindWindow(None, win_name)
windowcor = win32gui.GetWindowRect(hWnd)
w=windowcor[2]-windowcor[0]
h=windowcor[3]-windowcor[1]
wDC = win32gui.GetWindowDC(hWnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, bmpfilenamename)
#dcObj.DeleteDC()
#cDC.DeleteDC()
#win32gui.ReleaseDC(hWnd, wDC)
im=Image.open(bmpfilenamename)
im.load()
Upvotes: 3
Views: 5354
Reputation: 29690
Comment out this line:
dataBitMap.SaveBitmapFile(cDC, bmpfilenamename)
and add this instead:
bmpinfo = dataBitMap.GetInfo()
bmpstr = dataBitMap.GetBitmapBits(True)
im = Image.frombuffer(
'RGB',
(bmpinfo['bmWidth'], bmpinfo['bmHeight']),
bmpstr, 'raw', 'BGRX', 0, 1)
[from another SO question ]
Upvotes: 14
Reputation: 4500
If you are using PIL why not to use it for screenshoting?
PIL contains ImageGrab module, which can be used like:
import win32gui, win32ui, win32con
import Image
import ImageGrab
win_name='Book'
hWnd = win32gui.FindWindow(None, win_name)
windowcor = win32gui.GetWindowRect(hWnd)
im = ImageGrab.grab(windowcor)
However it will get correct screenshot only if your app is foreground.
Upvotes: -1