Я искал альтернативные решения для захвата экрана в растровое изображение на компьютере с Windows.
Теперь я знаю, что в PIL есть библиотека ImageGrab, и я, вероятно, в конечном итоге буду ее использовать.Однако во время поисков я наткнулся на решение, которое использует ctypes для доступа к функциям gdi32.dll и использует их для захвата экрана.Я нашел одно конкретное решение, которое не работает, и я пытался выяснить, в чем дело.
Вот исходный код:
from ctypes import *
class Bitmap(Structure):
_fields_ = [("bitmapType", c_long),
("width", c_long),
("height", c_long),
("widthBytes", c_long),
("planes", c_short),
("bitsPerPixel", c_short),
("data", POINTER(c_ulong))]
if __name__ == "__main__":
user32 = WinDLL("user32.dll")
gdi32 = WinDLL("gdi32.dll")
#Constants
SM_CXSCREEN = 0
SM_CYSCREEN = 1
SRCCOPY = 0xCC0020
#Capture the Bitmap
width = user32.GetSystemMetrics(SM_CXSCREEN)
height = user32.GetSystemMetrics(SM_CYSCREEN)
screenDC = user32.GetWindowDC(user32.GetDesktopWindow())
captureDC = gdi32.CreateCompatibleDC(screenDC)
captureBitmap = gdi32.CreateCompatibleBitmap(screenDC, width, height)
gdi32.SelectObject(captureDC, captureBitmap)
gdi32.BitBlt(captureDC, 0, 0, width, height, screenDC, 0, 0, SRCCOPY)
picture = Bitmap()
gdi32.GetObjectA(captureBitmap, 24, byref(picture))
Теперь, чтобымне кажется, что в конце программы, автор пытается скопировать растровое изображение в объект растрового изображения, но: 1. Я не смог найти документацию по функции gdi32.GetObjectA 2. При попытке просмотреть данные внутри picutre.данные (я надеюсь, что я не ошибся при доступе к picture.data.contents), я получаю сообщение об ошибке «Доступ к нулевому указателю».
Теперь на странице, где я нашел этот фрагмент кода, былаОтвет на проблему, но он был немного расплывчатым и не очень информативным.Ответ читается следующим образом:
You must allocate the integer array for the data pointer of the BITMAP structure.
GetObject doesn't it for you.
Разве функция gdi32.CreateCompatibleBitmap не должна выделять эту память, и не копирует ли GetObject указатель на представление Python структуры растрового изображения?
Я действительно запутался здесь, любой свет, пролившийся на эту проблему, был бы очень признателен.(У меня уже есть 15 открытых вкладок со ссылками на MSDN gdi32 и еще 15 со ссылками на ctypes, но, видя, что я тоже не совсем понимаю, я чувствую, что я хожу по кругу)