PIL and Bitmap from WinAPI

感情迁移 提交于 2019-12-30 03:33:09

问题


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()

回答1:


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 ]




回答2:


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.



来源:https://stackoverflow.com/questions/6951557/pil-and-bitmap-from-winapi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!