Как сделать снимок экрана с помощью Ruby? - PullRequest
2 голосов
/ 31 декабря 2011

Мне нужно сделать снимок экрана с помощью Ruby, а затем получить массив значений пикселей RGB для каждого пикселя на экране.

Я попробовал Windows API и могу побитовать экран и получить дескрипторрастровое изображение, но я понятия не имею, как получить доступ к необработанным значениям RGB в данных этого дескриптора.

Это то, что у меня есть в данный момент, и это достаточно быстро, но мне нужно получить значения RGB изhbitmap в массив, с которым я могу работать.

Все, что быстрее, чем Bitblt, но проще, также будет оценено.

def getscreen()

width = Win32API.new("User32.dll","GetSystemMetrics",["L"],"L").call(0)
height = Win32API.new("User32.dll","GetSystemMetrics",["L"],"L").call(1)

#Get desktop DC, create a compatible dc, create a comaptible bitmap and select into compatible dc.
hddc = Win32API.new("User32.dll","GetDC",["L"],"L").call(Win32API.new("User32.dll","GetDesktopWindow",[],"L").call)
hcdc = Win32API.new("Gdi32.dll","CreateCompatibleDC",["L"],"L").call(hddc)
hbitmap = Win32API.new("Gdi32.dll","CreateCompatibleBitmap",["L","L","L"],"L").call(hddc,width,height)
Win32API.new("Gdi32.dll","SelectObject",["L","L"],"L").call(hcdc,hbitmap)
Win32API.new("Gdi32.dll","BitBlt",["L","L","L","L","L","L","L","L","P"],"L").call(hcdc,0,0,width,height,hddc,0,0,"SRCCOPY|CAPTUREBLT")

#save hbitmap to stream of byte as you mentioned
puts hbitmap


#

Win32API.new("User32.dll","ReleaseDC",["L","L"],"L").call(Win32API.new("User32.dll","GetDesktopWindow",[],"L").call,hddc)
Win32API.new("Gdi32.dll","DeleteDC",["L"],"L").call(hcdc)
Win32API.new("Gdi32.dll","DeleteObject",["L"],"L").call(hbitmap)

#Print screen width and height
puts "Screen width: #{width}"
puts "Screen height: #{height}"

end

1 Ответ

0 голосов
/ 01 января 2012

Я понял, как это сделать, поэтому решил опубликовать решение для тех, кому может понадобиться помощь.

Функция GetDIBits Win32API может использоваться для доступа к массиву RGB, хранящемуся в растровом изображении, записанном с помощью приведенного выше кода.

http://msdn.microsoft.com/en-us/library/dd144879%28v=vs.85%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...