2011-08-05 29 views
2

我有代碼,使用winapi窗口的屏幕截圖。然後我必須將圖像保存到磁盤並將其從磁盤重新加載到內存PIL。有沒有任何方法,而不保存到磁盤傳遞PIL中的位圖。從WinAPI 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() 

回答

7

註釋出這一行:

dataBitMap.SaveBitmapFile(cDC, bmpfilenamename) 

並添加此代替:

bmpinfo = dataBitMap.GetInfo() 
bmpstr = dataBitMap.GetBitmapBits(True) 
im = Image.frombuffer(
    'RGB', 
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']), 
    bmpstr, 'raw', 'BGRX', 0, 1) 

[從another SO question]

-1

如果您使用PIL爲什麼不使用它來截圖?
PIL包含ImageGrab模塊,它可以像使用:

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) 

但是它會得到正確的截圖只有當你的應用程序是前景。

+1

我有許多監視器。 ImageGrab僅從主顯示器截取屏幕截圖。並且winapi截圖窗口沒有焦點。由於重疊,您可以拍攝窗口的截圖。 – Echeg