Image Datei lesen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Hallo,

ich versuche von Kodi das Icon vom Live-TV auszulesen, zu speichern und wieder zu öffnen um es auf meinem 0,96" Display auszugeben. Leider ohne Erfolg.

Nun versuche ich einen anderen Weg. Ich möchte jetzt den Namen des Senders auslesen was ja schon geklappt hat und den dann als Namen nehmen um ein Bild zu laden.

Code: Alles auswählen

thumb = xbmc.getInfoLabel('VideoPlayer.ChannelName')

	
	image = Image.open('/home/osmc/')thumb('.png').resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')
Das geht aber nicht. Wie kann ich das machen? Hat jemand eine Idee?

Vielen Dank für jede Hilfe. Bin ein Anfänger.
BlackJack

@tjost: Das scheitert ja schon daran das es syntaktisch falsch ist. Das sieht aus als würdest Du Python-Syntax raten wollen. So funktioniert programmieren nicht. Du müsstest Dich also als erstes mal mit den Python-Grundlagen beschäftigen.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

ich verbinde das was ich kenne mit dem was sich mir logisch erscheint.
Bloße Theorie kann ich nicht lernen. Leider. Ich habe das schon oft probiert aber bloße Theorie erschließt sich mir einfach nicht.

Ist es möglich den Wert auszulesen und diesen (In meinem Fall ZDF HD als Beispiel) dann als Namen einzusetzen vor das .png und so die Datei laden?
In anderen Sprachen geht das.

Oder hat jemand eine Ahnung was ich eingeben muss um ein ListItem.Icon als png zu speichern und dann zu öffnen?

Danke für das Verständnis.
BlackJack

@tjost: Wenn das was einem logisch erscheint nicht dem entspricht was tatsächlich logisch ist und damit auch praktisch funktioniert, musst man die Grundlagen lernen. Weil raten lassen die sich nur sehr mühselig, und selbst wenn es dann funktioniert, weiss man nicht ob es wirklich funktioniert, oder man den Fehler nur noch nicht gefunden hat. Die Grundlagen lernen hat auch nichts mit Theorie zu tun. Du musst ja nicht theoretisch lernen wie gültige Python-Syntax aussieht und wie die Auswertungsreihenfolge und Zwischenergebnisse von Ausdrücken aussehen und welche Operationen Dir bei den Grunddatentypen und externen Modulen zur Verfügung stehen, sondern ganz praktisch.

Wenn man versucht die Zeile mit dem Syntaxfehler auszuführen, dann passiert folgendes:
[codebox=text file=Unbenannt.txt] image = Image.open('/home/osmc/')thumb('.png').resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')
^
SyntaxError: invalid syntax[/code]
Das heisst alles was nach ``thumb`` kommt braucht man erst einmal nicht betrachten, denn das davor kommt schon nicht am Compiler vorbei weil es kein gültiges Python ist. Kann man leicht und praktisch überprüfen in dem man es entfernt und erneut ausführt:
[codebox=text file=Unbenannt.txt] image = Image.open('/home/osmc/')thumb
^
SyntaxError: invalid syntax[/code]
Jetzt ist die Frage was Du Dir dabei gedacht hast was das bedeuten soll und warum Du auf diese Idee gekommen bist‽ In welche Einzelteile kann man das zerlegen und welchen Wert/welches Ergebnis haben die Teilausdrücke jeweils.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

tjost hat geschrieben:Hallo,

ich versuche von Kodi das Icon vom Live-TV auszulesen, zu speichern und wieder zu öffnen um es auf meinem 0,96" Display auszugeben.
Vielleicht hilft Dir der unten verlinkte Rohling weiter, der ist doch wohl für Kodi, falls ich es richtig verstanden haben sollte:

viewtopic.php?f=5&p=311178#p311178

Und ohne Grundlagen geht es nun einmal nicht, in keiner Programmiersprache.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Erst einmal Danke..... schauen wir mal ob wir auf einen Nenner kommen.

Jetzt ist die Frage was Du Dir dabei gedacht hast was das bedeuten soll und warum Du auf diese Idee gekommen bist‽ In welche Einzelteile kann man das zerlegen und welchen Wert/welches Ergebnis haben die Teilausdrücke jeweils

Code: Alles auswählen

image = Image.open('/home/osmc/')thumb('.png').resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')
image: das ist der Wert den ich mit dem Bild füllen möchte. Angezeigt wir er mit "disp.image(image)"

image.open: es soll ein Bild geöffnet werden.

('/home/osmc/blabla.png'): absoluter Pfad und Name des Bildes.

.resize((disp.width, disp.height), Image.ANTIALIAS).convert('1'): Bild wird in der Größe nach den Werten disp.width und disp.height skaliert dann in Graustufen und 1 bit konvertiert.

Das funktioniert auch wunderbar. Nun war mein Plan mit "thumb = xbmc.getInfoLabel('VideoPlayer.ChannelName')" Den aktuellen Kanalnamen auszulesen und in thumb zu speichern und dann vor das '.png' zu setzten damit dann das Bild geladen werden kann.

Die Idee habe ich aus früheren gebastel meinerseits zuletzt z.b. bei Kodi "<texture>$INFO[Control.GetLabel(32),progress-right/a,.png]</texture>" Das hat aber auch schon in Xcode funktioniert als ich eine App für das iPhone gebastelt hatte.


"thumb = xbmc.getInfoIcon('InfoLabel.Icon')" scheint keinen Wert auszulesen denn wenn ich das abspeichern möchte mit "thumb.save('thump.png') bekomme ich den Fehler : "AttributeError: 'str' object has no attribute 'save'" Was mir damit erkläre das aus "xbmc.getInfoIcon('InfoLabel.Icon')" nicht ausgelesen wird.
Dieser Weg währe mir natürlich lieber aber XBMC/Kodi gibt nicht alle Werte aus die ich mir Wünsche.

Ich lese im Netz nach was ich will und arbeite mich dann ran. Habe mit dem was mir zur Verfügung steht klein angefangen und nur einen Text ausgeben auf dem Display. Danach ein Text den ich aus Kodi ausgelesen habe, dann ein Bild, und nun bin ich an diesem Punkt und stocke.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Melewo hat geschrieben:
tjost hat geschrieben:Hallo,

ich versuche von Kodi das Icon vom Live-TV auszulesen, zu speichern und wieder zu öffnen um es auf meinem 0,96" Display auszugeben.
Vielleicht hilft Dir der unten verlinkte Rohling weiter, der ist doch wohl für Kodi, falls ich es richtig verstanden haben sollte:

viewtopic.php?f=5&p=311178#p311178

Und ohne Grundlagen geht es nun einmal nicht, in keiner Programmiersprache.
Hallo und Danke.

Ja ich das mit den Grundlagen verstehen daran arbeite ich ja gerade. Ich habe ein eigenes AddOn auch auf meiner Repo das geht.
Dieses AddOn hilft mir nicht weiter weil ich die Ergebnisse ja auf meinem Display ausgeben möchte nicht auf dem Fernseher.
Es gibt zwar ein AddOn was das kann dieses wird aber seit 4 Jahren nicht mehr wirklich gepflegt und für mein Display gibt es keinen Treiber den müsste ich selber codieren und kompilieren. Das kann ich nicht.

Darum helfen mir solche Hallo Welt Lernprogramme und so nicht weiter weil sie nicht für das Display sind. Das alles habe ich ja schon ausgegeben aus dem Display.
BlackJack

@tjost: Die Frage die sich mir stellt ist wie Du von

Code: Alles auswählen

Image.open('/home/osmc/blabla.png')
auf

Code: Alles auswählen

thumb = 'blabla'
Image.open('/home/osmc/')thumb('.png')
kommst. Ich wage zu behaupten das niemand der Python-Grundlagen beherrscht, also eine Idee davon hat was die Klammern hier in Python bedeuten, erwarten würde, dass das syntaktisch geht. Und wenn man Zeichenketten und deren grundlegende Operationen kennen würde, macht das noch weniger Sinn. Du solltest also dringend mal ein Grundlagentutorial durcharbeiten. Also nicht einfach nur lesen oder überfliegen, sondern das alles auch praktisch nachvollziehen, Werte ändern, Vermutungen darüber anstellen was sich am Ergebnis ändern wird, das überprüfen, und falls Erwartung und Ergebnis nicht übereinstimmen, herausfinden warum das so ist. Das ist keine Theorie, das ist praktisches Lernen. In der Python-Dokumentation befindet sich beispielsweise ein Tutorial. Wenn Du das durchgearbeitet hast, dann hast Du das notwendige Wissen Funktionen und Methoden aufzurufen und mit Zeichenketten umzugehen. (Wobei man Pfadteile nicht mit Zeichenkettenoperationen sondern mit `os.path.join()` verbinden sollte.)

``xbmc.getInfoIcon('InfoLabel.Icon')`` liefert einen Rückgabewert, aber das ist laut Fehlermeldung eine Zeichenkette (Typ `str`) und Zeichenketten haben keine `save()`-Methode. Wobei es diese Funktion scheinbar gar nicht gibt‽ Kann es sein das Du eigentlich `getInfoImage()` meinst?

Laut API-Dokumentation liefert `getInfoImage()` den Dateinamen inklusive Pfad zum Bild als Zeichenkette. Da braucht man also auch nicht zu raten ob und was sie als Ergebnis liefert.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Vielen Dan für deine belehrenden Worte und den Standpunkt den du damit vertrittst.
Ich gehe an die Sache anders ran.

Die Hilfe die ich mir gewünscht hatte hast Du gegeben. Du hast mir gesagt das es einen Wert ausliest und welcher das sein soll.
Ich habe dazu im Internet nichts gefunden.

Nun werde ich auf dieser Grundlage weiter versuchen das Ergebnis zu erzielen was ich mir wünsche.

Kurz, wäre ohne Belehrung auch gegangen. Danke.

Unglaublich ich bin 41 Jahre alt und habe sehr viel erreicht in meinem Leben. Das ist ein Hobby was ich nur zeitweise ausübe, vielleicht 30 Minuten am Tag mehr Zeit habe ich dazu nicht und doch muss ich mir in jedem Forum das selbe anhören. Ich verstehe nicht warum man nicht einfach helfen kann wenn man da bock auf hat oder es sein lässt wenn nicht.
BlackJack

@tjost: Du musst Dir überall das gleiche anhören weil das nun mal so ist das Programmieren durch Raten nicht funktioniert. Das hat auch nichts mit dem Alter zu tun, oder was man alles erreicht hat, oder das das nur ein Hobby ist. Dadurch ändert sich die Technik ja nicht. Dem Rechner ist das alles herzlich egal wer ihn da programmiert. Der verhält sich bei jedem gleich.

Ich verstehe nicht wie man programmieren will wenn man keinen Bock darauf hat programmieren zu lernen.

Beim programmieren (lernen) habe ich Dir sicher nicht geholfen. Hätte ich gerne, aber Du magst die Hilfe anscheinend weder von mir, noch von vielen anderen annehmen.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Nochmals Danke für die Hilfe. Aber auf Grundsatzdiskussionen wollte ich nicht schreiben. Ich wollte nicht erst python lernen nur um mein Display so laufen zu lassen wie ich es mir wünsche. Ich habe nur ein Problem und war auf der Suche nach einer Lösung.
Also warum verweigert man mir dann Halbwegs die Hilfe und sagt fange bei Null an und dann helfe ich vielleicht.

Mein Kumpel möchte in seinem Haus Löcher in der Wand haben und kann das nicht. Da helfe ich ihm und zeige ihm wie man ein Loch bohrt ohne das ich ihm erst erkläre wie ein Bohrer funktioniert und Materialkunde. Und mehr wollte ich nicht.

Ich möchte gerne Hilfe für mein Problem nicht was Programmieren angeht. Wie ich daraus was lerne ist in meinem Kopf.
BlackJack

@tjost: Wenn Du kein Python lernen willst, dann bist Du hier falsch. Denn genau darum geht es in diesem Forum. Nicht darum etwas für andere zu programmieren die gar nicht wissen wollen wie das funktioniert.

Der Vergleich mit dem Löcher bohren hinkt, denn das ist doch wesentlich einfacher als Programmieren. Und wenn ein Kumpel zu mir kommt, dann mache ich das vielleicht auch, aber wenn ein Fremder zu Dir kommt und sagt „Bohr mir mal Löcher in die Wand, nein, nein ich will das nicht lernen was an meinem Loch falsch ist, bohr mir einfach Löcher in die Wand wie ich das möchte” — also ich fänd so eine Erwartungshaltung ziemlich schräg.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

PN
Das muss man hier nicht ausdiskutieren.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

tjost hat geschrieben:Unglaublich ich bin 41 Jahre alt und habe sehr viel erreicht in meinem Leben. Das ist ein Hobby was ich nur zeitweise ausübe, vielleicht 30 Minuten am Tag mehr Zeit habe ich dazu nicht und doch muss ich mir in jedem Forum das selbe anhören.
Das Alter spielt ja gerade bei einem Hobby wie Programmieren kaum eine Rolle. Keine Ahnung wie alt die anderen hier sind, doch ich habe 2008 im Alter von 54 Jahren mein erstes Script in PHP geschrieben und musste dazu sehr viel lernen. Nun bin ich 63 und lerne seit gut 2 Monaten Python und muss wieder sehr viel lernen. Und wenn mir die Zeit zum Lernen oder für einen Hobby wie Programmieren fehlen würde, dann würde ich halt nicht versuchen selbst etwas zu programmieren.
tjost
User
Beiträge: 20
Registriert: Freitag 23. Juni 2017, 21:29

Respekt dafür. Wirklich ich ziehe vor jedem meinen Hut der das kann. Mir ist das aus unterschiedlichen Gründen die ich hier nicht erläutern möchte nicht möglich. Und glaube mir ich habe seit vielen Jahren ja fast Jahrzehnten versucht eine Programmiersprache zu lernen und zu beherrschen. Das ist mir aber nicht möglich.
Egal glaubt mir wahrscheinlich eh keiner aber egal.
Ich war als Säugling fast 15 Minuten tot. Bin im Krankenhaus auch noch fallen gelassen worden. Ich habe seit dem Hirnschäden und Depressionen. Ich habe Schwierigkeiten mir Sachen zu merken wenn ich sie nicht jeden Tag wiederhole. Ich kann nicht mal ein Buch lesen ohne auf Seite 15 schon wieder vergessen zu haben was auf Seite 1 stand. Darum auch mein etwas harscher Ton. Ich kann nicht verstehen warum man mir nicht einfach hilft. Das gehört zu meinen Depressiven Problemen.
Die haben hier aber eigentlich nichts zu suchen und will mich auch nicht immer erklären müssen nur weil ich eine Frage habe.
Ich habe ein Ziel da möchte ich hin und hoffe auf nette Leute die mir einfach nur selbstlos helfen weil sie Bock haben ihr Wissen zu teilen. genau so wie ich es auch mache wenn ich etwas weis und andere da Hilfe brauchen.
Ich bin stolz auf das was ich mit und ohne Hilfe geschaffen habe auf meinem Raspberry.
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")
Antworten