Get pixel’s RGB using PIL
However, it only outputs a number (e.g. 0 or 1 ) and not three numbers (e.g. 60,60,60 for R,G,B). I guess I’m not understanding something about the function. I’d love some explanation. Thanks a lot.
5 Answers 5
im = Image.open('image.gif') rgb_im = im.convert('RGB') r, g, b = rgb_im.getpixel((1, 1)) print(r, g, b) (65, 100, 137)
The reason you were getting a single value before with pix[1, 1] is because GIF pixels refer to one of the 256 values in the GIF color palette.
See also this SO post: Python and PIL pixel values different for GIF and JPEG and this PIL Reference page contains more information on the convert() function.
By the way, your code would work just fine for .jpg images.
im = Image.open('image.gif') im_matrix = np.array(im) print(im_matrix[0][0])
Give RGB vector of the pixel in position (0,0)
GIFs store colors as one of x number of possible colors in a palette. Read about the gif limited color palette. So PIL is giving you the palette index, rather than the color information of that palette color.
Edit: Removed link to a blog post solution that had a typo. Other answers do the same thing without the typo.
An alternative to converting the image is to create an RGB index from the palette.
from PIL import Image def chunk(seq, size, groupByList=True): """Returns list of lists/tuples broken up by size input""" func = tuple if groupByList: func = list return [func(seq[i:i + size]) for i in range(0, len(seq), size)] def getPaletteInRgb(img): """ Returns list of RGB tuples found in the image palette :type img: Image.Image :rtype: list[tuple] """ assert img.mode == 'P', "image should be palette mode" pal = img.getpalette() colors = chunk(pal, 3, False) return colors # Usage im = Image.open("image.gif") pal = getPalletteInRgb(im)
Получение и изменение цвета пикселя в изображении. Библиотека PIL Python
8 августа 2013 г.
Archy
Просмотров: 57362
RSS
Обсудить
Работа с изображениями » Python для начинающих
изменить пиксель python, сменить формат изображения python, сохранения изображения python
В прошлой статье мы узнали как установить библиотеку PIL в Python и начать уже с ней работать. В этой статье мы продолжаем изучение библиотеки PIL. Начиная с версией 1.1.6 метод load() возвращает объект, с помощью которого можно получить доступ к отдельным пикселям изображения. Указав два значения внутри квадратных скобок, можно получить или задать цвет пикселя.
>>> img = Image.open("foto.jpg") >>> obj = img.load() >>> obj[25, 45] # Получаем цвет пикселя (122, 86, 62) >>> obj[25, 45] = (255, 0, 0) # Задаем цвет пикселя (красный)
Для доступа к отдельному пикселю вместо метода load() можно использовать методы getpixel() и putpixel(). Метод getpixel() позволяет получить цвет указанного пикселя, а метод putpixel(, ) изменяет цвет пикселя. Координаты пикселя указываются в виде кортежа из двух элементов. Необходимо заметить, что эти методы работают медленнее метода load(). Пример использования метода getpixel() и putpixel() приведен ниже.
Использование метода getpixel() и putpixel()
>>> img = Image.open("foto.jpg") >>> img.getpixel((25, 45)) # Получаем цвет пикселя (122, 86, 62) >>> img.putpixel((25, 45), (255, 0, 0)) # Изменяем цвет пикселя >>> img.getpixel((25, 45)) # Получаем цвет пикселя (255, 0, 0) >>> img.show() # Просматриваем изображение
В этом примере для просмотра изображения мы воспользовались методом show(). Метод show() создает временный файл в формате BMP и запускает программу для просмотра изображения, используемую в операционной системе по умолчанию. Например, на моем компьютере запускается программа ACDSee. Для сохранения изображения в файл предназначен метод save().
В первом параметре указывается абсолютный или относительный путь. Вместо пути можно передать файловый объект, открытый в бинарном режиме. Сохраним изображение в форматах JPEG и BMP разными способами.
Сохраняем изображение в Python
>>> img.save("tmp.jpg") # В формате JPEG >>> img.save("tmp.bmp", "BMP") # В формате BMP >>> f = open("tmp2.bmp", "wb") >>> img.save(f, "BMP") # Передаем файловый объект >>> f.close()
Обратите внимание на то, что мы открыли файл в формате JPEG, а сохранили его в формате BMP. Таким образом, можно открывать изображения в одном формате и конвертировать его в другой формат. Если сохранить изображение не удалось, возбуждается исключение IOError. Если параметр не указан, то формат изображения определяется по расширению файла.
В параметре можно указать дополнительный характеристики изображения. Поддерживаемый опции зависят от формата изображения. Например, по умолчанию изображения в формате JPEG сохраняются с качеством 75. С помощью опции quality можно указать другое значение в диапазоне от 1 до 100.
>>> img.save("tmp3.jpg", "JPEG", quality=100) # Указание качества
За дополнительной информации по опциям обращайтесь к документации. Так же для более подробной инструкции игры в покер можете прочитать poker правила и повысить свои навыки в этой игре. Удивите своих знакомых во время игры в покер, продемонстрировав им свой профессионализм игры.
Как считывать цвет конкретных пиксели с сайта,Python
Есть сайт, на котором расположены прямоугольники. Нужно узнать их цвет и вывести в консоль как RGB . Пример сайта: Пример того, что должно получиться в консоли (оформление не имеет значения):
Попробуйте делать скриншоты веб-страниц и затем с помощью pillow или других графических библиотек разбирать на пиксели. По скриншотам тут есть пример ru.stackoverflow.com/questions/821285/…
1 ответ 1
Так как мне нравится все делать на PyQt5, то я вам и продемонстрирую как бы я это сделал.
Если вы еще не устанонови PyQt5, то я очень рекомендую.
PyQt — реализация фреймворка Qt для языка Python.
pip install PyQt5 pip install pyqt5-tools
Теперь запускаем python main.py , нажимаем на пипетку и водим по экрану, на консоль получаем результат.
from PyQt5.QtCore import QByteArray, Qt, QRectF, QLineF, pyqtSignal, QTimer from PyQt5.QtGui import (QFontDatabase, QFont, QPainter, QPainterPath, QColor, QPen) from PyQt5.QtWidgets import (QPushButton, QApplication, QWidget, QDialog, QVBoxLayout) FONT = b'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' class ScaleWindow(QWidget): # Увеличенное окно просмотра def __init__(self, *args, **kwargs): super(ScaleWindow, self).__init__(*args, **kwargs) self.setWindowFlags(Qt.Tool | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) self.setAttribute(Qt.WA_TranslucentBackground, True) self.resize(1, 1) self.move(1, 1) self._image = None def updateImage(self, pos, image): self._image = image self.resize(image.size()) self.move(pos.x() + 10, pos.y() + 10) self.show() self.update() def paintEvent(self, event): super(ScaleWindow, self).paintEvent(event) if self._image: painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing, True) path = QPainterPath() radius = min(self.width(), self.height()) / 2 path.addRoundedRect(QRectF(self.rect()), radius, radius) painter.setClipPath(path) # изображение painter.drawImage(self.rect(), self._image) # Средний синий перекрестие painter.setPen(QPen(QColor(0, 174, 255), 3)) hw = self.width() / 2 hh = self.height() / 2 painter.drawLines( QLineF(hw, 0, hw, self.height()), QLineF(0, hh, self.width(), hh) ) # рамка painter.setPen(QPen(Qt.white, 3)) painter.drawRoundedRect(self.rect(), radius, radius) class CColorStraw(QPushButton): colorChanged = pyqtSignal(QColor) def __init__(self, parent): super(CColorStraw, self).__init__(parent) # Загрузка шрифтов в библиотеку шрифтов QFontDatabase.addApplicationFontFromData(QByteArray.fromBase64(FONT)) font = self.font() or QFont() font.setFamily('iconfont') self.setFont(font) self.setText('') self.setToolTip('Нарисуйте цвет экрана') self._scaleWindow = ScaleWindow() # Не забудьте сначала показать его, а затем спрятать. self._scaleWindow.show() self._scaleWindow.hide() def closeEvent(self, event): self._scaleWindow.close() super(CColorStraw, self).closeEvent(event) def mousePressEvent(self, event): super(CColorStraw, self).mousePressEvent(event) # Установите стиль мыши на крест self.setCursor(Qt.CrossCursor) def mouseReleaseEvent(self, event): super(CColorStraw, self).mouseReleaseEvent(event) # Установите стиль мыши на нормальный self.setCursor(Qt.ArrowCursor) self._scaleWindow.hide() def mouseMoveEvent(self, event): super(CColorStraw, self).mouseMoveEvent(event) # Получить положение мыши на экране pos = event.globalPos() # Возьмите часть увеличенного изображения image = QApplication.primaryScreen().grabWindow( int(QApplication.desktop().winId()), pos.x() - 6, pos.y() - 6, 13, 13).toImage() color = image.pixelColor(6, 6) print(f'RGB color -> (, , )') if color.isValid(): self.colorChanged.emit(color) self._scaleWindow.updateImage(pos, image.scaled(130, 130)) if __name__ == '__main__': import sys import cgitb sys.excepthook = cgitb.enable(1, None, 5, '') app = QApplication(sys.argv) w = QDialog() layout = QVBoxLayout(w) view = CColorStraw(w) view.colorChanged.connect(lambda c: print(c.name())) layout.addWidget(view) w.exec_() QTimer.singleShot(200, app.quit) sys.exit(app.exec_())