Color of a screen pixel
From Rosetta Code
You are encouraged to solve this task according to the task description, using any language you may know.
Contents |
[edit] AutoHotkey
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%
[edit] BASIC
Works with: QuickBasic version 4.5
In a graphics mode (for instance, SCREEN 13 or SCREEN 12)
color = POINT(x, y)
[edit] C
Works with: Windows
COLORREF getColorAtCursor(void) {
POINT p;
COLORREF color;
HDC hDC;
BOOL b;
// Get the device context for the screen
hDC = GetDC(NULL);
if (hDC == NULL)
return CLR_INVALID;
// Get the current cursor position
b = GetCursorPos(&p);
if (!b)
return CLR_INVALID;
// Retrieve the color at that position
color = GetPixel(hDC, p.x, p.y);
// Release the device context again
ReleaseDC(GetDesktopWindow(), hDC);
return color;
}
[edit] C#
using System;
using System.Drawing;
using System.Windows.Forms;
Bitmap img = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(img);
g.CopyFromScreen(new Point(x, y), new Point(0, 0), new Size(1, 1));
Color color = img.GetPixel(x, y);
[edit] Clojure
(defn get-color-at [x y]
(.getPixelColor (java.awt.Robot.) x y))
[edit] F#
The C# example copies the entire screen into our private bitmap but that's unnecessary. All we need is the single pixel. Also, it doesn't appear that the bitmap and graphics object are being disposed of there. Other than that, this is essentially identical to that solution.
open System.Drawing
open System.Windows.Forms
let GetPixel x y =
use img = new Bitmap(1,1)
use g = Graphics.FromImage(img)
g.CopyFromScreen(new Point(x,y), new Point(0,0), new Size(1,1))
let clr = img.GetPixel(0,0)
(clr.R, clr.G, clr.B)
let GetPixelAtMouse () =
let pt = Cursor.Position
GetPixel pt.X pt.Y
[edit] Java
public static Color getColorAt(int x, int y){
return new Robot().getPixelColor(x, y);
}
[edit] PureBasic
Return the color used at the x,y position in the current output. If the current output has an alpha channel then the result will be a 32bit RGBA value, otherwise it will be a 24bit RGB value. The color can be split in their RGB and alpha values by using the Red(), Green(), Blue() and Alpha() functions.
Color = Point(x, y)
To get the colour of a pixel on the screen when it is not managed by PureBasic (ie. from other programs' windows), it is necessary to use Windows API. This works only under Windows.
hDC = GetDC_(0)
Color = GetPixel_(hDC, x, y)
ReleaseDC_(0, hDC)
This work fine!!
poz.point
If OpenWindow(0,0,0,100,45,"Get pixel color at cursor position",#PB_Window_MinimizeGadget)
TextGadget(0,0,0,50,12,"Red: ")
TextGadget(1,0,15,50,12,"Green: ")
TextGadget(2,0,30,50,12,"Blue: ")
TextGadget(3,50,0,50,12,"")
TextGadget(4,50,15,50,12,"")
TextGadget(5,50,30,50,12,"")
hDC = GetDC_(0)
Repeat
oldx=poz\x
oldy=poz\y
GetCursorPos_(@poz)
Color = GetPixel_(hDC, poz\x, poz\y)
If poz\x<>oldx Or poz\y<>oldy
SetGadgetText(3,Str(Red(color)))
SetGadgetText(4,Str(Green(color)))
SetGadgetText(5,Str(Blue(color)))
EndIf
event=WaitWindowEvent(200)
Until event=#PB_Event_CloseWindow
ReleaseDC_(0, hDC)
EndIf
[edit] Python
Library: PyWin32
def get_pixel_colour(i_x, i_y):
import win32gui
i_desktop_window_id = win32gui.GetDesktopWindow()
i_desktop_window_dc = win32gui.GetWindowDC(i_desktop_window_id)
long_colour = win32gui.GetPixel(i_desktop_window_dc, i_x, i_y)
i_colour = int(long_colour)
return (i_colour & 0xff), ((i_colour >> 8) & 0xff), ((i_colour >> 16) & 0xff)
print get_pixel_colour(0, 0)
Library: PIL
Works with: Windows only
def get_pixel_colour(i_x, i_y):
import PIL.ImageGrab
return PIL.ImageGrab.grab().load()[i_x, i_y]
print get_pixel_colour(0, 0)
Library: PIL Library: python-xlib
def get_pixel_colour(i_x, i_y):
import PIL.Image # python-imaging
import PIL.ImageStat # python-imaging
import Xlib.display # python-xlib
o_x_root = Xlib.display.Display().screen().root
o_x_image = o_x_root.get_image(i_x, i_y, 1, 1, Xlib.X.ZPixmap, 0xffffffff)
o_pil_image_rgb = PIL.Image.fromstring("RGB", (1, 1), o_x_image.data, "raw", "BGRX")
lf_colour = PIL.ImageStat.Stat(o_pil_image_rgb).mean
return tuple(map(int, lf_colour))
print get_pixel_colour(0, 0)
Library: PyGTK
def get_pixel_colour(i_x, i_y):
import gtk # python-gtk2
o_gdk_pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1)
o_gdk_pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(), gtk.gdk.colormap_get_system(), i_x, i_y, 0, 0, 1, 1)
return tuple(o_gdk_pixbuf.get_pixels_array().tolist()[0][0])
print get_pixel_colour(0, 0)
Library: PyQt
def get_pixel_colour(i_x, i_y):
import PyQt4.QtGui # python-qt4
app = PyQt4.QtGui.QApplication([])
long_qdesktop_id = PyQt4.QtGui.QApplication.desktop().winId()
long_colour = PyQt4.QtGui.QPixmap.grabWindow(long_qdesktop_id).toImage().pixel(i_x, i_y)
i_colour = int(long_colour)
return ((i_colour >> 16) & 0xff), ((i_colour >> 8) & 0xff), (i_colour & 0xff)
print get_pixel_colour(0, 0)
[edit] Tcl
Library: Tk Works only on X11 or OSX with Xquartz.
package require Tcl 8.5
package require Tk
# Farm out grabbing the screen to an external program.
# If it was just for a Tk window, we'd use the tkimg library instead
proc grabScreen {image} {
set pipe [open {|xwd -root -silent | convert xwd:- ppm:-} rb]
$image put [read $pipe]
close $pipe
}
# Get the RGB data for a particular pixel (global coords)
proc getPixelAtPoint {x y} {
set buffer [image create photo]
grabScreen $buffer
set data [$image get $x $y]
image delete $buffer
return $data
}
# Demo...
puts [format "pixel at mouse: (%d,%d,%d)" \
{*}[getPixelAtPoint {*}[winfo pointerxy .]]]
[edit] TI-89 BASIC
Only the graph screen can be read.
pxlTest(y, x) © returns boolean

