Image Datei lesen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

tjost hat geschrieben:Ich kann nicht verstehen warum man mir nicht einfach hilft. Das gehört zu meinen Depressiven Problemen.
Aber das ist je nach gegebenen Antworten normal, weil ein Forum mehr Hilfe zur Selbsthilfe und weniger ein kostenloser Support ist. Gut, dass überschneidet sich, hängt dann aber von weiteren Umständen, wie der Mitarbeit des Fragestellers ab.

Habe bisher weder Raspberry Pi noch Kodi, über den Raspberry Pi hatte ich mich nur bereits vor Python belesen, was damit alles möglich ist. Und zu Kodi, warum steht da in dem Download-Beispiel iconImage='DefaultFolder.png', wenn es nicht irgendetwas mit dem Icon zu tun hätte?

Oder für was ist diese ganze Liste gut?

http://kodi.wiki/view/Default_Icons
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

In dem Beispiel wird beschrieben wie man eine Liste erstellt. Da wird dann aus dem Skin das Default.Icon geladen und angezeigt.
Die Ausgabe findet dann normal über den TV/Monitor statt.
Ich habe aber ein 0,96" Monochrome Display. Die Ausgabe dort wird speziell gerendert da es 1 Bit 128x64 Pixel sein muss.
Darum hilft mir das nicht wirklich weiter denn dieses Script AddOn ist nicht für die Ausgabe auf dem kleinem Display gedacht.
Ich will mir ja auch nicht einfach ein normales Icon anzeigen lassen, das kann ich und funktioniert auch.
Ich möchte vom Live-TV das jeweilige gespeicherte Icon des Senders anzeigen lassen. Hier wird es etwas kompliziert denn die Icons werden von einem dritten Programm zur verfügung gestellt (TVHeadend) und dann von Kodi abgerufen und angezeigt. Dieses Icon möchte ich abrufen und dann auf dem Display anzeigen lassen.
Ich war der Meinung das es aus meinem ersten Post klar hervorging.
Aber wenn man nur den Code liest und daraus seine Schlüsse zieht ohne die eigentliche Frage zu verstehen und zu beantworten kann man mir nicht den Vorwurf machen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Das Monochrome ist mir entgangen, hatte zwar etwas von einem 0,96" Display gelesen, doch was das eigentlich ist erst jetzt gesehen, als ich nach Bildern von so einem Display suchte.

Wo Du ein Bild nun herbekommst, kann ich Dir nicht verraten, auf Bittiefe 1 zu verringern, das funktioniert schon einmal, mit dem Verkleinern noch nicht wirklich, da wurde zwar die 64 für die Höhe übernommen, doch die Breite mit 93 gespeichert. Ok, ein richtig erkennbares Bild ist es auch nicht mehr.

Code: Alles auswählen

from PIL import Image

testbild = Image.open("images/testbild.png").convert("1")
testbild.thumbnail((128,64), Image.ANTIALIAS)
testbild.save("thumbnail.png", "PNG")
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Code: Alles auswählen

image = Image.open('bla.png').resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')
Damit funktioniert das öffnen eines Bildes und das Skalieren.

Code: Alles auswählen

disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
Hier hole ich die Werte des Displays.

Nun möchte ich aber eine Datei öffnen dessen Namen ich erst aus einem anderen Value auslese.
Wie kann ich nun also eine Datei Laden dessen Namen sich beim Umschalten ändert?
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Na ja, eine Möglichkeit wäre die zu cachen, dabei einen anderen Namen zu vergeben und aus dem Cache zu laden.

Code: Alles auswählen

from PIL import Image

thumbs = "anderer-name"

testbild = Image.open('images/testbild.png').resize((128,64), Image.ANTIALIAS).convert('1')
speicher = "cache/{}.png".format(thumbs)
testbild.save(speicher, "PNG")
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
Antworten