Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How to do a getPixel on Win32 using Ruby?

3 views
Skip to first unread message

Jian Lin

unread,
Nov 14, 2009, 1:16:38 PM11/14/09
to
Does someone know how to do a getPixel on Win32 using Ruby? (either to
get a pixel's color value on a window or on the whole screen). thanks.
--
Posted via http://www.ruby-forum.com/.

Jian Lin

unread,
Nov 14, 2009, 1:21:56 PM11/14/09
to
Jian Lin wrote:
> Does someone know how to do a getPixel on Win32 using Ruby? (either to
> get a pixel's color value on a window or on the whole screen). thanks.

ah... and also setPixel() too.

Jian Lin

unread,
Nov 14, 2009, 1:41:46 PM11/14/09
to
I thought it would be something like

user32 'GetPixel', ['L', 'I', 'I' ], 'L'

as in
-----------------------------------------------------------
require 'Win32API'

def user32(name, param_types, return_value)
Win32API.new 'user32' , name, param_types, return_value
end

set_cursor_pos = user32 'SetCursorPos', ['L' , 'L' ], 'I'
mouse_event = user32 'mouse_event', ['L' , 'L' , 'L' , 'L' , 'L' ], 'V'

get_pixel = user32 'GetPixel', ['L', 'I', 'I' ], 'L'

get_pixel.call 0, 0, 0
-----------------------------------------------------------
but there is an error giving out

get_pixel.rb:4:in `initialize': GetProcAddress: GetPixel or GetPixelA
(RuntimeError)

from get_pixel.rb:4:in `new'
from get_pixel.rb:4:in `user32'
from get_pixel.rb:10

Marvin Gülker

unread,
Nov 14, 2009, 1:43:43 PM11/14/09
to
Jian Lin wrote:
> Jian Lin wrote:
>> Does someone know how to do a getPixel on Win32 using Ruby? (either to
>> get a pixel's color value on a window or on the whole screen). thanks.
>
> ah... and also setPixel() too.

Do you want to draw onto the screen?

If so, I think you should use a GUI toolkit, create a maximized window,
without a title bar and border, and then draw onto it. For example, in
wxRuby:
------------------
require "wx"

class MyApp < Wx::App
include Wx

def on_init
@mainwindow = Frame.new(nil, -1, "", DEFAULT_POSITION, DEFAULT_SIZE,
MAXIMIZE)
@mainwindow.background_colour = BLACK
Timer.after(3000) do
@mainwindow.paint do |dc|
dc.pen = WHITE_PEN
dc.draw_line(0, 0, 500, 500)
end
end
Timer.after(5000){@mainwindow.close}
@mainwindow.show
end

end

x = MyApp.new
x.main_loop
-------------------

This creates a maximized, black window and after 3 seconds it draws a
white line from (0|0) to (500|500). After five seconds (from the
beginning) it closes the window.
Tested with ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] on
Windows Vista.

Marvin

Jian Lin

unread,
Nov 14, 2009, 8:10:23 PM11/14/09
to
Marvin Gülker wrote:

>
> Do you want to draw onto the screen?
>
> If so, I think you should use a GUI toolkit, create a maximized window,
> without a title bar and border, and then draw onto it.

can wxRuby get a pixel's color value off from the screen too? (not
window but the screen)

Marvin Gülker

unread,
Nov 15, 2009, 6:59:44 AM11/15/09
to
Jian Lin wrote:
> Marvin Gülker wrote:
>
>>
>> Do you want to draw onto the screen?
>>
>> If so, I think you should use a GUI toolkit, create a maximized window,
>> without a title bar and border, and then draw onto it.
>
> can wxRuby get a pixel's color value off from the screen too? (not
> window but the screen)

If you create the window like I showed, it will fill the *entire*
screen. There's nothing else than the window to see (not even the
taskbar!), so it's equivalent if you get the pixel from your window or
the screen. And so does it work:
-------------------------
require "wx"

class MyApp < Wx::App
include Wx

def on_init
@mainwindow = Frame.new(nil, -1, "", DEFAULT_POSITION, DEFAULT_SIZE,
MAXIMIZE)
@mainwindow.background_colour = BLACK
Timer.after(3000) do
@mainwindow.paint do |dc|
dc.pen = WHITE_PEN
dc.draw_line(0, 0, 500, 500)

#Get the pixel color at (100|10) which should be black.
col = Colour.new(255, 255, 255) #This means white
dc.get_pixel(100, 10, col)
p col #=> (0, 0, 0) #This means black


end
end
Timer.after(5000){@mainwindow.close}
@mainwindow.show
end

end

x = MyApp.new
x.main_loop
------------------------
The #get_pixel method seems to be directly imported from C, because it
works like it would require a pointer. However, it works. The method to
set a pixel directly, is #draw_point.

Marvin

0 new messages