- How to read the RGB value of a given pixel in Python?
- 13 Answers 13
- Smoke testing the code
- Получение RGB цвета определённого пикселя на экране
- Python-сообщество
- #1 Авг. 8, 2018 20:34:26
- Быстрое получение цвета пикселя с экрана
- #2 Авг. 9, 2018 07:52:19
- Быстрое получение цвета пикселя с экрана
- #3 Авг. 9, 2018 11:58:37
- Быстрое получение цвета пикселя с экрана
- #4 Авг. 10, 2018 12:07:23
- Быстрое получение цвета пикселя с экрана
- #5 Авг. 10, 2018 14:10:23
- Быстрое получение цвета пикселя с экрана
How to read the RGB value of a given pixel in Python?
If I open an image with open(«image.jpg») , how can I get the RGB values of a pixel assuming I have the coordinates of the pixel? Then, how can I do the reverse of this? Starting with a blank graphic, ‘write’ a pixel with a certain RGB value? I would prefer if I didn’t have to download any additional libraries.
13 Answers 13
It’s probably best to use the Python Image Library to do this which I’m afraid is a separate download.
The easiest way to do what you want is via the load() method on the Image object which returns a pixel access object which you can manipulate like an array:
from PIL import Image im = Image.open('dead_parrot.jpg') # Can be many different formats. pix = im.load() print im.size # Get the width and hight of the image for iterating over print pix[x,y] # Get the RGBA Value of the a pixel of an image pix[x,y] = value # Set the RGBA Value of the image (tuple) im.save('alive_parrot.png') # Save the modified pixels as .png
Alternatively, look at ImageDraw which gives a much richer API for creating images.
I used this on my Mac (Pypi): easy_install —find-links http://www.pythonware.com/products/pil/ Imaging
For future readers: pip install pillow will install PIL successfully and fairly quickly (may need sudo if not in a virtualenv).
pillow.readthedocs.io/en/latest/… shows bash commands in windows installation steps. No really sure how to proceed.
Using Pillow (which works with Python 3.X as well as Python 2.7+), you can do the following:
from PIL import Image im = Image.open('image.jpg', 'r') width, height = im.size pixel_values = list(im.getdata())
Now you have all pixel values. If it is RGB or another mode can be read by im.mode . Then you can get pixel (x, y) by:
Alternatively, you can use Numpy and reshape the array:
>>> pixel_values = numpy.array(pixel_values).reshape((width, height, 3)) >>> x, y = 0, 1 >>> pixel_values[x][y] [ 18 18 12]
A complete, simple to use solution is
# Third party modules import numpy from PIL import Image def get_image(image_path): """Get a numpy array of an image so that one can access values[x][y].""" image = Image.open(image_path, "r") width, height = image.size pixel_values = list(image.getdata()) if image.mode == "RGB": channels = 3 elif image.mode == "L": channels = 1 else: print("Unknown mode: %s" % image.mode) return None pixel_values = numpy.array(pixel_values).reshape((width, height, channels)) return pixel_values image = get_image("gradient.png") print(image[0]) print(image.shape)
Smoke testing the code
You might be uncertain about the order of width / height / channel. For this reason I’ve created this gradient:
The image has a width of 100px and a height of 26px. It has a color gradient going from #ffaa00 (yellow) to #ffffff (white). The output is:
[[255 172 5] [255 172 5] [255 172 5] [255 171 5] [255 172 5] [255 172 5] [255 171 5] [255 171 5] [255 171 5] [255 172 5] [255 172 5] [255 171 5] [255 171 5] [255 172 5] [255 172 5] [255 172 5] [255 171 5] [255 172 5] [255 172 5] [255 171 5] [255 171 5] [255 172 4] [255 172 5] [255 171 5] [255 171 5] [255 172 5]] (100, 26, 3)
- The shape is (width, height, channels)
- The image[0] , hence the first row, has 26 triples of the same color
Получение RGB цвета определённого пикселя на экране
Поиск определенного пикселя на экране
Здравствуйте. Я хочу найти определённый пиксель на экране. Я опробовал способ через opencv.
Поиск определенного пикселя на экране
Всем привет. Пишу игрового бота. Дано: Есть часть экрана размером в 1080х871 Нужно: Найти в этой.
получение координат пикселя определённого цвета
Не так давно начал изучать c++, перебрал множество вариантов. не как не могу быстро найти.
Получение значений RGB из пикселя
Имеется SDL_Surface в который я загрузил картинку, нужно получить значения RGB для каждого.
from PIL import Image im = Image.open('1.jpg', 'r') width, height = im.size pixel_values = list(im.getdata()) print(pixel_values)
from matplotlib.image import imread img = imread('abc.tiff') print(type(img))
import cv2 im = cv2.imread("abc.tiff",mode='RGB') print type(im)
никто не ответил про самый простой способ. Держите кому надо
>>> import pyautogui >>> pix = pyautogui.pixel(100, 200) >>> pix RGB(red=130, green=135, blue=144) >>> pix[0] 130 >>> pix.red 130
import win32gui def pixel_color_at(x, y): hdc = win32gui.GetWindowDC(win32gui.GetDesktopWindow()) c = int(win32gui.GetPixel(hdc, x, y)) # (r, g, b) return (c & 0xff), ((c >> 8) & 0xff), ((c >> 16) & 0xff) print(pixel_color_at(10, 10)) print(pixel_color_at(*win32gui.GetCursorPos()))
Определение цвета пикселя под курсором и контроль RGB ленты на Arduino
Доброго времени суток уважаемые форумчане! Как получить цвет пикселя под курсором на экране при.
Цвет определенного пикселя на экране
Как сделать процедуру с помощью которой в текстовом редакторе отображался цвет(в формате.
Определение цвета пикселя на экране
Добрый вечер, нужна помощь! Пишу программу, которая при определенном цвете пикселя выполняет клик.
Определение цвета пикселя на экране
Ребят, сразу прошу не счесть за тупость. Я гуглил! Представим, у меня есть на экране область, цвет.
Узнать цвет определенного пикселя на экране
Привет всем:) столкнулся с проблемой, а проблема состоит в том, что я хочу узнать цвет.
Поиск координат пикселя определенного цвета
Здравствуйте, уважаемые участники форума! Я только начинаю программировать на С++ Builder. У меня.
Быстрый поиск цвета пикселя на экране монитора
Подскажите как можно реализовать быстрый поиск определеного пикселя на экране. Накидал.
Python-сообщество
- Начало
- » Python для новичков
- » Быстрое получение цвета пикселя с экрана
#1 Авг. 8, 2018 20:34:26
Быстрое получение цвета пикселя с экрана
Нужно как можно быстрее получать информацию о цвете пикселя с экрана.
Благодаря каким библиотекам это можно реализовать? Желательно с примером кода. Спасибо.
Пока что пробую pyautogui.pixel() но он слишком медленный вот сам код
import time import pyautogui from pynput import keyboard pressD = False pressF = False pressJ = False pressK = False RUN = True while RUN: #D colorD = pyautogui.pixel(210,610) #Получение цвета пикселя print("colorD = ",colorD[0]) #Значение RED канала пикселя if colorD[0] > 230: #спам клавиши "d" keyboard.Controller().press('d') pressD = True print("'D' Down") else: if pressD: #прекращение спама keyboard.Controller().release('d') pressD = False print("'D' UP") #F colorF = pyautogui.pixel(310,610) #Получение цвета пикселя print("color = ",colorF[2]) #Значение BLUE канала пикселя if colorF[2] > 230: #спам клавиши "f" keyboard.Controller().press('f') pressF = True print("'F' Down") else: if pressF: #прекращение спама keyboard.Controller().release('f') pressF = False print("'F' UP") #J colorJ = pyautogui.pixel(410,610) #Получение цвета пикселя print("color = ",colorJ[2]) #Значение BLUE канала пикселя if colorJ[2] > 230: #спам клавиши "j" keyboard.Controller().press('j') pressJ = True print("'J' Down") else: if pressJ: #прекращение спама keyboard.Controller().release('j') pressJ = False print("'J' UP") #K colorK = pyautogui.pixel(510,610) #Получение цвета пикселя print("color = ",colorK[0]) #Значение RED канала пикселя if colorK[0] > 230: #спам клавиши "k" keyboard.Controller().press('k') pressK = True print("'K' Down") else: if pressK: #прекращение спама keyboard.Controller().release('k') pressK = False print("'K' UP")
Код спамит клавиши D,F,J,K при правильном цвете соответствующих пикселей
Если быть точным, то мне нужно получение цвета 4 пикселей экрана не реже чем 60 раз в секунду (Суммарно в секунду не менее 240 значений)
Отредактировано lllNF (Авг. 10, 2018 12:06:56)
#2 Авг. 9, 2018 07:52:19
Быстрое получение цвета пикселя с экрана
С чего вы решили что он медленный? Где код по которому вы сделали вывод что он медленный?
ps
Если надо быстро обрабатывать картинку, то практически никогда не работают с отдельными пикселами даже на С не говоря уже о питоне у которого просто циклы в сотни раз медленнее.
#3 Авг. 9, 2018 11:58:37
Быстрое получение цвета пикселя с экрана
lllNF код в студию потому как даже в pyautogui есть несколько способов получить цвет пиксела.
#4 Авг. 10, 2018 12:07:23
Быстрое получение цвета пикселя с экрана
import time import pyautogui from pynput import keyboard pressD = False pressF = False pressJ = False pressK = False RUN = True while RUN: #D colorD = pyautogui.pixel(210,610) #Получение цвета пикселя print("colorD = ",colorD[0]) #Значение RED канала пикселя if colorD[0] > 230: #спам клавиши "d" keyboard.Controller().press('d') pressD = True print("'D' Down") else: if pressD: #прекращение спама keyboard.Controller().release('d') pressD = False print("'D' UP") #F colorF = pyautogui.pixel(310,610) #Получение цвета пикселя print("color = ",colorF[2]) #Значение BLUE канала пикселя if colorF[2] > 230: #спам клавиши "f" keyboard.Controller().press('f') pressF = True print("'F' Down") else: if pressF: #прекращение спама keyboard.Controller().release('f') pressF = False print("'F' UP") #J colorJ = pyautogui.pixel(410,610) #Получение цвета пикселя print("color = ",colorJ[2]) #Значение BLUE канала пикселя if colorJ[2] > 230: #спам клавиши "j" keyboard.Controller().press('j') pressJ = True print("'J' Down") else: if pressJ: #прекращение спама keyboard.Controller().release('j') pressJ = False print("'J' UP") #K colorK = pyautogui.pixel(510,610) #Получение цвета пикселя print("color = ",colorK[0]) #Значение RED канала пикселя if colorK[0] > 230: #спам клавиши "k" keyboard.Controller().press('k') pressK = True print("'K' Down") else: if pressK: #прекращение спама keyboard.Controller().release('k') pressK = False print("'K' UP")
Отредактировано lllNF (Авг. 10, 2018 12:09:48)
#5 Авг. 10, 2018 14:10:23
Быстрое получение цвета пикселя с экрана
lllNF а у вас часом не венда? если венда то таки да он может работать медленно. Начнем с того что что у самого pyautogui нет метода pixel(), оно берет его из pyscreeze
. try: import pyscreeze from pyscreeze import (center, grab, locate, locateAll, locateAllOnScreen, locateCenterOnScreen, locateOnScreen, pixel, pixelMatchesColor, screenshot) .
. def pixel(x, y): if sys.platform == 'win32': # On Windows, calling GetDC() and GetPixel() is twice as fast as using our screenshot() function. hdc = windll.user32.GetDC(0) color = windll.gdi32.GetPixel(hdc, x, y) # color is in the format 0xbbggrr https://msdn.microsoft.com/en-us/library/windows/desktop/dd183449(v=vs.85).aspx r = color % 256 g = (color // 256) % 256 b = color // (256 ** 2) return (r, g, b) else: return screenshot().getpixel((x, y)) .
а у венды почемуто начмная с висты и выше с вклченным Windows Desktop Composition, GetPixel работает ну просто очень медленно. Хотя в коментах написано что GetPixel() работает в два раза быстрее чем screenshot().getpixel()
ps обсуждение сабжа на стекверфлов
https://stackoverflow.com/questions/3800458/quickly-getting-the-color-of-some-pixels-on-the-screen-in-python-on-windows-7
хотя ХЗ, вроде не так уж и медленно 0.003 сек у меня, по крайней мере
Отредактировано PEHDOM (Авг. 10, 2018 14:26:09)