Image Datei lesen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
BlackJack

@Melewo: Du gehst beim konvertieren in Deinem Test in der falschen Reihenfolge vor. Du willst das Bild nicht erst in eine monochrome Bitmap umwandeln und dann skalieren sondern umgekehrt. Bei skalieren will man noch so viel wie möglich Information pro Pixel haben.

Und auch die Grösse ist richtig. Man möchte doch das die Seitenverhältnisse erhalten bleiben und nicht das verkleinerte Bild horizontal oder vertikal verzerrt. Wenn die Breite bei Dir kleiner als die gewünschte ist, dann ist Dein Ausgangsbild halt nicht im gleichen Seitenverhältniss wie die gewünschte Thumbnail-Grösse.

Dein letzter Beitrag passt auch nicht zur Frage. Es soll eine Datei gelesen und nicht gespeichert werden. Ob man da nun einen Cache rein bastelt oder nicht, ist erst einmal eine ganz andere Frage.

@tjost: Dann musst Du statt 'bla.png' eben den ausgelesenen Namen verwenden.

Die letzte Frage ist eine Frage über die Kodi-API. Du musst das auslesen und anzeigen jedes mal bei einem Kanalwechsel machen. Wie auch immer Kodi das Plugin darüber informiert: Da muss das passieren.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

@BlackJack: Ja, sieht jetzt besser aus. Ich muss das immer erst alles testen, bevor ich es verstehe, auch mit den .Verknüpfungen.

Code: Alles auswählen

from PIL import Image

testbild = Image.open("images/testbild.png").resize((128,64), Image.ANTIALIAS).convert("1")
testbild.save("thumb-09.png", "PNG")

# Funktioniert mit resize, nicht aber mit thumbnail

testbild = Image.open("images/testbild.png").thumbnail((128,64), Image.ANTIALIAS).convert("1")
testbild.save("thumb-02.png", "PNG")

# AttributeError: 'NoneType' object has no attribute 'convert'

testbild = Image.open("images/testbild.png").thumbnail((128,64), Image.ANTIALIAS)
testbild = testbild.convert("1")
testbild.save("thumb-12.png", "PNG")

# AttributeError: 'NoneType' object has no attribute 'convert'

testbild = Image.open("images/testbild.png")
testbild.thumbnail((128,64), Image.ANTIALIAS)
testbild = testbild.convert("1")
testbild.save("thumb-11.png", "PNG")

# Funktioniert richtig, ohne das Bild zu verzerren
BlackJack

@Melewo: `resize()` gibt ein neues `Image`-Objekt zurück, `thumbnail()` dagegeben verändert das `Image`-Objekt auf dem es aufgerufen wurde und gibt ”nichts” zurück. Speziell die Dokumentation zu `thumbnail()` macht sehr deutlich das die Methode das Bildobjekt selbst verändert.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

@tjost: Dann musst Du statt 'bla.png' eben den ausgelesenen Namen verwenden.
Da kommen wir zu meiner Frage: Wie kann ich die ausgelesene Info nennen wir sie thumb = xbmc.getInfoLabel('ListItem.Icon') laden? Was muss ich da machen. Dazu habe ich nichts gefunden.
Die letzte Frage ist eine Frage über die Kodi-API. Du musst das auslesen und anzeigen jedes mal bei einem Kanalwechsel machen. Wie auch immer Kodi das Plugin darüber informiert: Da muss das passieren.
Das macht das script in Kodi selber, verändert sich der Wert wird auch das Display aktualisiert.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Hat das nichts damit zu tun?
Und wenn das nichts damit zu tun hat, dann müsstest Du filename halt selbst auslesen.
ListItem.PicturePath - Shows the filename and path of the selected picture
http://kodi.wiki/view/InfoLabels
BlackJack

@Melewo: Nein das ist für Bilder, nicht für Icons von TV-Sendern. Ich denke es wird schon das richtige abgefragt.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Das habe ich so auch schon herausgefunden. Was muss ich schreiben in python um eine Datei zu laden?

image.open AUSGELESENERNAME.png resize convert bla. Das möchte ich gerne wissen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Ich dachte, Du hättest da schon längst einen Pfad oder eine Var zum Einfügen.

Tut mir leid, falls das völlig falsch sein sollte, doch könnte es sein, dass Du Dir die Sender.icons allein herunterladen musst, damit die dann erkannt und zugeordnet werden?
Mir fehlen immer noch die Senderlogos
https://www.kodinerds.net/index.php/Thr ... nderlogos/
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

also,
ich werde mir eigene Icons machen die auf dem kleinen Display sinn m: achen.
Diese benenne ich dann nach dem jeweiligem Namen des Senders. Z.B.: Das Erste HD.png
Den Namen lese ich dann mit thumb=xbmc.listinfo('VideoPlayer.ChannelName "Name of the curently tuned channel (PVR)."')

Nun hat der Wert thumb den Namen Das Erste HD.
Diesen Wert möchte als Dateinamen verwenden um dann die Datei zu öffnen also das was ich anfangs schrieb image.open (Pfad zur Datei) thumb (png) resize convert.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Die kannst Du Dir auch bei Pinterest oder anderen Portalen herunterladen und dann nur noch verkleinern und abmagern. Und speichern würde ich alles in klein mit Binde- oder Unterstrichen und dann in SQLite speichern.

Sendernamen | Icons
Das Erste HD | das-erste.png
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

@Melewo
danke aber es geht nicht um die Icons. Die habe ich alle wunderschöne Icons und ich kann sie auch öffnen und auf dem Display anzeigen lassen.

Es geht nur darum das ich eine Datei öffnen möchte des Namen aus einer Variablen kommt.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Also die Icons hast Du alle bereits?
Wie viele sind es denn?
Wenn eine überschaubare Anzahl, dann würde ich einen Dictionary benutzen, doch wenn es zu viele werden (las etwas von über 4.000 zum Download) würde ich SQLite nehmen.

In einem Dictionary:
{"Das Erste HD": "das-erste-hd.png", ...}

Oder SQLite:
Sendernamen | Icons
Das Erste HD | das-erste-hd.png

Und dann ist das ein schneller Vergleich und das zugeordnete Icon wird geladen.
BlackJack

@Melewo: Dir ist schon klar das diese ganzen Vorschläge hier *nichts* bringen werden‽ ;-)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Na ja, ich ging ja davon aus, dass die Icons von den Sendern übermittelt werden, bis ich in dem anderen Forum etwas davon las, dass man sich die als Zip-Archiv selbst von einem Portal herunterladen kann und bereits als Thumbs verkleinert abgelegt, nur noch dem jeweiligen Sender zuordnen und anzuzeigen braucht.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Verstehe ich jetzt so, dass es sich um eine halbwegs aktuelle Sammlung mit 4.435 Senderlogos handelt, von denen aber nur die ersten 1.000 in der Liste angezeigt werden.

Und unter diesen Mischmasch von Groß- und Kleinschreibung und mit Leerzeichen dazwischen, würde ich die halt nicht abspeichern.
Sorry, we had to truncate this directory to 1,000 files. 3,435 entries were omitted from the list.
https://github.com/3PO/Senderlogos
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

@Melewo
Um Himmels willen ..... ne ne sind nur ca 120 Icons. Ist nur normales Kabel Fernsehen. Logos werden da ja leider nicht übermittelt.
Ich habe ein Ordner mit Icons. Die sind Grundsätzlich also nicht das Problem.

@BlackJack.
Wie wäre mal mit einer Antwort anstelle eines dummen Kommentars. Ich gehe davon aus das Du als Python Profi weder die Frage verstanden hast noch eine Lösung des Problem haben wirst.
BlackJack

@Melewo: Die Dateinamen entsprechen den Sendernamen welche die Sender selbst in den Metadaten mitschicken. Das heisst man muss nur den Sendernamen ermitteln und hat damit gleich den Dateinamen für's Logo. Warum sollte man da jetzt anfangen die umzubenennen und eine extra Datei anzulegen die Sendernamen auf Dateinamen abbildet? Das macht nur unnötig Arbeit.

@tjost: Netter Versuch. ;-)
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

@BlackJack beweise mir das Gegenteil.

Die Daten der Logos kommen von TVHeadend und sehen ungefähr so aus. "1987c9198dchzbbocq87ezrocb2937z.png" Kodi bekommt die Daten von TVHeadend und aus Kodi kann ich dann nur den Namen auslesen.

Bild

Hier mal ein Vergleich wie das Display aussieht und wie groß es ist.

Bild

Dieses Logo einfach zu übernehmen macht wenig Sinn weil man es dann nicht mehr erkennen könnte.

Darum möchte ich den Weg gehen den Sendernamen auszulesen und den erhaltenen Wert dann an ein .png anfügen um es zu laden.

Melowe gibt sich immerhin Mühe mein Problem zu verstehen. Er hat spaß daran was neues zu lernen. Vor einem Problem zu stehen was er noch nicht hatte und daraus etwas neues zu lernen. Das rechne ich im Hoch an. Du hingegen blockst nur, stellst mich als Trottel da und hilfst nicht einen millimeter weiter.
Hast Du mal darüber nachgedacht das viel hier reinklicken, sehen das ein Moderator im ersten Post nur negative schreibt und sich dann sofort nicht weiter beteiligen? Das soll nicht die Funktion eines Moderators sein. Also entweder hilfst Du jetzt oder Du lässt Melowe und mich das Problem lösen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

@BlackJack: Weil beim Bilderupload eine häufige Fehlerquelle war, wenn die Images mit Namen hochgeladen wurden, wie sie auf einem Windowsrechner lagen. Nicht bei mir, doch häufig bei WP-Nutzern, die den Unterschied zwischen Windows und Linux-Verwandten nicht kannten und dann nichts wegen irgendwelcher Sonderzeichen oder Unterschieden bei der Groß- und Kleinschreibung geladen wurde. Und es sind ja in der Liste von 3PO/Senderlogos auch nicht wenige, die ein Fragezeichen an Stelle von Umlauten oder Sonderzeichen enthalten.

@tjost: Gut, ich habe ein einfaches Beispiel nun erst einmal so fertig gemacht. Ob Du an Stelle der Sendernamen nun irgendwelche anderen Kennungen wie "1987c9198dchzbbocq87ezrocb2937z" benutzen musst, müsstest Du Dir selbst ausprobieren. Auch weiß ich augenblicklich nicht, wie das mit einer Aktualisierung geregelt werden könnte.

Code: Alles auswählen

import os

senderlogos = {
    "Das Erste": "das-erste.png",
    "Das Erste HD": "das-erste-hd.png",
    "Live-TV": "live-tv.png",
    }

sender = xbmc.getInfoLabel("VideoPlayer.ChannelName")

if sender in senderlogos:
    logo = senderlogos[sender]
else:
    logo = "ersatzbild.png"
    
pfad = "name_deines_icon_verzeichnisses"
image = Image.open(os.path.join(pfad, logo))
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

@Melewo Danke das os.join hatte ich nicht gefunden nun geht es.

Code: Alles auswählen

import time

import xbmcaddon
import xbmcgui
import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
import os
import sys

addon		= xbmcaddon.Addon()

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont


    
import subprocess
# Raspberry Pi pin configuration:
RST = 24
# Note the following are only used with SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0

# Beaglebone Black pin configuration:
# RST = 'P9_12'
# Note the following are only used with SPI:
# DC = 'P9_15'
# SPI_PORT = 1
# SPI_DEVICE = 0

# 128x32 display with hardware I2C:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# 128x64 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# 128x32 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# 128x64 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# Raspberry Pi pin configuration:
RST = 24
# Note the following are only used with SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0

# Beaglebone Black pin configuration:
# RST = 'P9_12'
# Note the following are only used with SPI:
# DC = 'P9_15'
# SPI_PORT = 1
# SPI_DEVICE = 0

# 128x32 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# 128x64 display with hardware I2C:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# 128x32 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# 128x64 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# Initialize library.
disp.begin()

# Clear display.
disp.clear()
disp.display()

# big thanks to Melewo from the Python-Forum.de for helping me get on track.

while True:
	
	thumb = xbmc.getInfoLabel("VideoPlayer.ChannelName")

	suffix = '.png'
	dir_name = "/home/osmc/icon/"
	display = os.path.join(dir_name, thumb + suffix)

	image = Image.open(display).resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')

# Display image.
	disp.image(image)
	disp.display()
Das mal der Code und hier ein Video wie es aussieht:

https://youtu.be/AtDwLQliCEU

Das war das was ich brauchte. Nun kann ich daran weiter arbeiten und es verfeinern.
Ich kann Dir gar nicht sagen wie sehr ich mich über Deine Hilfe freue und wie Dankbar ich bin.
Falls Du dich fragst was das Logitech soll, ich habe den Pi in einen alten Centerlautsprecher aus meiner Logitech Anlage gebaut. Sieht einfach schöner aus so.
Zuletzt geändert von Anonymous am Montag 26. Juni 2017, 16:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Antworten