сохранение растровых данных в файл - PullRequest
2 голосов
/ 05 февраля 2012

Я пытаюсь сделать снимок экрана с python, используя только ctypes.

Я застреваю после битблта.у кого-нибудь есть код, который сохраняет растровый объект в файл с ctypes в python?

это код, который я написал до сих пор:

import ctypes    
from ctypes import *    

   #Constants   
   SM_CXSCREEN = 0   
    SM_CYSCREEN = 1        
    SRCCOPY = 0xCC0020         
    user32 = ctypes.windll.user32       
    gdi32 = ctypes.windll.gdi32    


class BITMAPINFOHEADER(ctypes.Structure):    
    _fields_ = [    
        ('biSize', ctypes.c_uint32),        
        ('biWidth', ctypes.c_int),    
        ('biHeight', ctypes.c_int),    
        ('biPlanes', ctypes.c_short),    
        ('biBitCount', ctypes.c_short),    
        ('biCompression', ctypes.c_uint32),    
        ('biSizeImage', ctypes.c_uint32),    
        ('biXPelsPerMeter', ctypes.c_long),    
        ('biYPelsPerMeter', ctypes.c_long),    
        ('biClrUsed', ctypes.c_uint32),    
        ('biClrImportant', ctypes.c_uint32)    
    ]    



class BITMAPINFO(ctypes.Structure):    
    _fields_ = [    
        ('bmiHeader', BITMAPINFOHEADER),    
        ('bmiColors', ctypes.c_ulong * 3)    
    ]    


hDesktopWnd = user32.GetDesktopWindow()    
WinDC = user32.GetDC (hDesktopWnd)    
CopyDC = gdi32.CreateCompatibleDC (WinDC)    
hBitmap = gdi32.CreateCompatibleBitmap (WinDC,  1000, 1000)    
gdi32.SelectObject (CopyDC, hBitmap)    
gdi32.BitBlt(CopyDC,   0,0, 1000,   1000,   WinDC,  0, 0,   SRCCOPY);    

я знаю, что следующим шагом будетчто-то вроде:

lpbi = BITMAPINFO()    
ctypes.memset(ctypes.byref(lpbi), 0x00, ctypes.sizeof(lpbi))    
lpbi.bmiHeader.biSize = ctypes.sizeof(BITMAPINFOHEADER)    
gdi32.SelectObject (CopyDC, hBitmap)    

...    

но это отстой и не сработало.пожалуйста, помогите.

...