Jump to content

image_data[0, 0] ➢ TypeError: 'Image' object is not subscriptable


Recommended Posts

Posted

Moin,

 

als Anfänger hat man es ziemlich schwer.

 

Okay, ich habe das Script zum OLED 128x64 Bricklet 2.0 hergenommen um ein Bild auszugeben. Wenn ich in Photoshop stellte Bitmaps lade, klappt es prima.

 

Nun erstelle ich aber die Bitmap in PIL. Und nun klappt es gar nicht mehr. :-(

 

Also, beim Aufruf von

image_data[0, 0]

bekomme ich die Fehlermeldung

TypeError: 'Image' object is not subscriptable

 

Bei den geladenen Bitmaps macht der Aufruf keine Probleme, bei den selbst erstellten Bitmaps aber schon.

 

Das funktioniert:

…
image_data = image.load()
pixel = image_data[column, row] > 0
…

 

Das funktioniert nicht:

…
image_data = Image.new('1', (128,64))
pixel = image_data[column, row] > 0
…

 

Beides sind 1-Bit-Bilder in 128 x 64 Pixel.

 

Hier ein Beispiel:

 

from PIL import Image, ImageDraw, ImageFont

Mode = "1"
Size = (21 * 5, 64)

# make a blank image for the text, initialized to transparent text color
image_data = Image.new('1', (128,64))

# get a font
fnt = ImageFont.truetype('Menlo.ttc', 28, 1)

# get a drawing context
d = ImageDraw.Draw(image_data)

# draw text, half opacity
d.text((15,15), "-42°C", font=fnt, fill=(255)) # draw text

print(image_data.size[0])
print(image_data.size[1])

print(image_data[0, 0])
print()

image_data.show()

 

In dem Ordner mit dem Script muss die Schrift Menlo liegen (im Anhang).

Menlo.ttc.zip

Posted

Das Testprogramm soll einen String mit großen Fonts anzeigen. Allerdings laufe ich jetzt in eine andere Fehlermeldung außerhalb meines eigenen Programms.

 

in dem einen Programm funktioniert es, in dem anderen Programm bekomme ich komische Fehlermeldungen. :-(

 

[size=9pt]Traceback (most recent call last):
  File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/ip_connection.py", line 1164, in send_request
    response = device.response_queue.get(True, self.timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/queue.py", line 178, in get
    raise Empty
_queue.Empty

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/gerhard/PycharmProjects/RedBrick/OLED-Test.py", line 56, in <module>
    oled.write_pixels(0, 0, WIDTH, HEIGHT, pixels)
  File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/bricklet_oled_128x64_v2.py", line 400, in write_pixels
    ret = self.write_pixels_low_level(x_start, y_start, x_end, y_end, pixels_length, pixels_chunk_offset, pixels_chunk_data)
  File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/bricklet_oled_128x64_v2.py", line 130, in write_pixels_low_level
    self.ipcon.send_request(self, BrickletOLED128x64V2.FUNCTION_WRITE_PIXELS_LOW_LEVEL, (x_start, y_start, x_end, y_end, pixels_length, pixels_chunk_offset, pixels_chunk_data), 'B B B B H H 448!', '')
  File "/Users/gerhard/PycharmProjects/RedBrick/tinkerforge/ip_connection.py", line 1173, in send_request
    raise Error(Error.TIMEOUT, msg)
tinkerforge.ip_connection.Error: Did not receive response for function 1 in time (-1)[/size]

 

Hier das betroffene Programm:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

HOST = "localhost"
PORT = 4223
UID = "XYZ" # Change to your UID
WIDTH = 128 # Columns
HEIGHT = 64 # Rows
MODE = "1"

import sys
from PIL import Image, ImageDraw, ImageFont
from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_oled_128x64_v2 import BrickletOLED128x64V2


if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    oled = BrickletOLED128x64V2(UID, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    # Clear display
    oled.clear_display()

    image = Image.new(MODE,(WIDTH,HEIGHT))
    font = ImageFont.truetype('Menlo.ttc', 28, 1)
    d = ImageDraw.Draw(image) # get a drawing context
    d.text((5, 15), "-42,0°C", font=font, fill=(255))  # draw text
    image_data = image.load()

    # Convert image to black/white pixels
    #image = Image.open(image_data)
    #print("size:  "+str(image_data.size[0]))
    pixels = []

    for row in range(HEIGHT):
        for column in range(WIDTH):
            print("row: " + str(row))
            print("column: " + str(column))
            # print(image.size[0])
            # print(image.size[1])
            # print(image_data[column, row])
            if column < image.size[0] and row < image.size[1]:
                pixel = image_data[column, row] > 0
            else:
                pixel = False

            pixels.append(pixel)

    print(pixels)
    print(len(pixels))
    image.show()

    oled.write_pixels(0, 0, WIDTH, HEIGHT, pixels)

    input('Press key to exit\n') # Use input() in Python 3
    ipcon.disconnect()

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...