3

I'd like to be able to create and interact with a Tkinter Canvas and, at any time, be able to iterate over each of its pixels and get their RGB values. Setting pixel by pixel is not necessary, just getting. However, methods analogous to Canvas's create_polygon(), create_line(), create_text(), and create_oval() must be available as well for interacting with the image overall.

There are a number of restraints:

  • Must work with Python 3
  • Must work with Linux, Mac, and Windows
  • Must work with libraries that come with Python (no downloads)

The second restraint is mainly the reason I've posted this question when getting the color of pixels on the screen in Python3.x and several other similar questions already exist.

If this is impossible, what is the closest I can get?

Community
  • 1
  • 1
C0urante
  • 39
  • 1
  • 4

2 Answers2

3

Try it. But is slow :/

from util.color import Color


class ImageUtils:

    @staticmethod
    def get_pixels_of(canvas):
        width = int(canvas["width"])
        height = int(canvas["height"])
        colors = []

        for x in range(width):
            column = []
            for y in range(height):
                column.append(ImageUtils.get_pixel_color(canvas, x, y))
            colors.append(column)

        return colors

    @staticmethod
    def get_pixel_color(canvas, x, y):
        ids = canvas.find_overlapping(x, y, x, y)

        if len(ids) > 0:
            index = ids[-1]
            color = canvas.itemcget(index, "fill")
            color = color.upper()
            if color != '':
                return Color[color.upper()]

        return "WHITE"
Paulo Mateus
  • 456
  • 6
  • 10
2

It's not possible. The canvas doesn't work that way.

If you're not interested in setting, you can use an image rather than a canvas. You can get the value of individual pixels in a PhotoImage.

Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685
  • I would, but I still need to be able to interact with the image with some of the methods provided by the Canvas class. Apologies for the lack of clarity in my question; edits have been made. – C0urante Jan 18 '15 at 23:30