imread und figsave - Probleme mit der Auflösung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

@Pittan: `show()` schreibt das Bild in eine temporäre Datei und verwendet ein externes Programm zum anzeigen. Anscheinend gibt es dabei Probleme. Die Methode ist laut Pillow-Dokumentation (Image.show()) auch hauptsächlich zur Fehlersuche gedacht, also weniger um in einem Programm tatsächlich die Bilder anzuzeigen.

Das gleiche kann Dir auch mit den vom Institut vorgegebenen Werkzeugen passieren, das etwas auf Deinem Rechner läuft und im Institut wegen unterschiedlicher Versionen, Einstellungen, oder anderer Rahmenbedingungen nicht. Oder umgekehrt.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hi Blackjack,

danke für den Hinweis.
Das Programm, dass ich schreibe, soll aber bei Ausführung genau die Bilder anzeigen. Daher verwende ich img.show()

Ein anderes Problem: ImageDraw.text verlangt als übergabe einen String, der auf dem Bild gezeigt wird.
Ich will aber keinen String übergeben, sondern die Variablen, deren Inhalt gezeigt werden soll.

Leider finde ich dazu keinen Hinweis. Funktioniert das überhaupt mit ImageDraw.text?

Danke
Gruß
BlackJack

@Pittan: Nein, diese Methode funktioniert dann nur mit literalen Zeichenketten. :twisted:

Wenn da Zeichenkette in der Dokumentation steht, dann ist natürlich jeder Ausdruck gemeint der zu einer Zeichenkette ausgewertet wird und nicht nur literale Zeichenketten. Das ist ja in etwa so als würdest Du fragen ob man mit `math.sin()` nur den Sinus von Gleitkommaliteralen berechnen kann, und nicht auch von ”Variablen” oder gar Rechenoperationen. Eine Funktion hat doch auch überhaupt gar keine direkt vorgesehene Möglichkeit überhaupt heraus zu finden wie ein Argumentwert zustande gekommen ist. Das geht die Funktion auch überhaupt nichts an.

Edit: Kleine Suche („PIL Image show() windows file not found”) ergibt übrigens dass das unter Windows Vista/Windows 7 ein grundsätzliches Problem mit PIL zu sein scheint. Ich würde als erstes prüfen ob Pillow das Problem auch hat, denn das wird ja aktiv weiter entwickelt.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

BlackJack hat geschrieben:@Pittan: Nein, diese Methode funktioniert dann nur mit literalen Zeichenketten. :twisted:

Wenn da Zeichenkette in der Dokumentation steht, dann ist natürlich jeder Ausdruck gemeint der zu einer Zeichenkette ausgewertet wird und nicht nur literale Zeichenketten. Das ist ja in etwa so als würdest Du fragen ob man mit `math.sin()` nur den Sinus von Gleitkommaliteralen berechnen kann, und nicht auch von ”Variablen” oder gar Rechenoperationen. Eine Funktion hat doch auch überhaupt gar keine direkt vorgesehene Möglichkeit überhaupt heraus zu finden wie ein Argumentwert zustande gekommen ist. Das geht die Funktion auch überhaupt nichts an.

Edit: Kleine Suche („PIL Image show() windows file not found”) ergibt übrigens dass das unter Windows Vista/Windows 7 ein grundsätzliches Problem mit PIL zu sein scheint. Ich würde als erstes prüfen ob Pillow das Problem auch hat, denn das wird ja aktiv weiter entwickelt.
Genau das habe ich gemeint! Nun habe ich 1 1/2 Tage Arbeitszeit verschwendet für eine S* die mir am Ende gar nichts gebracht hat.
Und der Inhalt meiner Arbeit ist es nicht, möglichst elegant und schön zu programmieren und wahnsinnig tolle Bildchen zu erzeugen - sondern wissenschaftliche, energietechnische Erkentnisse zu produzieren.
Dementsprechend habe ich wenig Lust unmengen an Energie zu verschwenden dieses kac* PIL, PILLOW, Inkscape oder sonstwas fuer einen Mist zu lernen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst es doch einfach selbst in eine temporäre Datei schreiben und dann nen Bildbetrachter ausführen, sehe jetzt nicht so das große Problem.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Pittan hat geschrieben:Dementsprechend habe ich wenig Lust unmengen an Energie zu verschwenden dieses kac* PIL, PILLOW, Inkscape oder sonstwas fuer einen Mist zu lernen.
Dann mach es per Hand und vergleiche den Aufwand. :roll:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Und dann habe ich immer noch das Problem, dass ich keine Variablen in PIL auf das Bild pinseln kann...
BlackJack

@Pittan: Okay, das mit den Bildchen ist Dir nicht sooo wichtig, aber wenn wir uns mal erinnern sind wir an diesem Punkt angelangt weil Dir mit `matplotlib` der Rand ein bisschen zu gross war. Ernsthaft!?

Hier geht es IMHO auch nicht um möglichst schön, und auch gar nicht über den Programmierstil selbst, sondern das Pixelgrafik für diese Aufgabe eine sehr hässliche Lösung ist. Das hat etwas von Alufolie statt einer Sicherung zu verwenden oder eine Schraube mit einem Hammer einzuschlagen. Klar kann man machen… Funktioniert auch.

Irgendwelchen ”Mist” musst Du ja lernen, ansonsten kannst Du es auch einfach manuell mit MS Paint machen. Wenn Du es aber per selbstgeschriebenem Programm machen möchtest, dann musst Du Dich in irgend etwas einarbeiten. Zum einfachen Bearbeiten von Pixelgrafik ist PIL/Pillow das wohl am meisten verbreitete Python-Package. Es ist weniger umfangreich und hat eine einfachere API als `matplotlib` würde ich jetzt mal behaupten.

Bezüglich der Variablen: Lies meinen Beitrag noch mal. Vielleicht mit eingeschaltetem Ironiedetektor. :roll:
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Pittan hat geschrieben:Und dann habe ich immer noch das Problem, dass ich keine Variablen in PIL auf das Bild pinseln kann...
Doch, das kannst du natürlich. Die folgenden beiden Codebeispiele führen zum gleichen Ergebnis.

Code: Alles auswählen

function('ABCdef')

Code: Alles auswählen

value = 'ABCdef'
function(value)
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

BlackJack hat geschrieben:
Bezüglich der Variablen: Lies meinen Beitrag noch mal. Vielleicht mit eingeschaltetem Ironiedetektor. :roll:
Sorry - ich verstehe es einfach nicht.

Wie soll es jetzt möglich sein, den Inhalt einer Variablen mittels PIL auf eine Grafik zu pinseln?
Kann man nun dazu ImageDraw.text verwenden oder nicht?
BlackJack

@Pittan: Natürlich ist das möglich. Wieso sollte das nicht möglich sein? Wie dämlich wäre denn eine API mit der man nur literale Zeichenketten verwenden kann? Die Vorstellung ist absurd. Zumal Python einer Funktionsimplementation ja gar nicht die Möglichkeit gibt, herauszufinden wie ein übergebenes Argument mal zustande gekommen ist. Da müsste man schon auf „deep magic” zurückgreifen. Und selbst dann wüsste ich nicht *warum* man so etwas tun sollte und noch weniger warum man eine API derartig einschränken wollen würde.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hallo Blackjack,
ich gebe dir recht, die Frage ob das möglich ist, ist hinfällig. Meine nun mittlerweile 2-Monatige Python-Expertise (und vorher habe ich noch nie programmiert) zeigt mir, dass prinzipiell alles möglich ist.
Die Frage ist nur, wie das möglich ist

Code: Alles auswählen

import Trinkwassererwaermung as TWW
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

####### DARTSTELLUNG TRINKWARMWASSER##########
img=Image.open("Trinkwassererwaermung.png")
draw=ImageDraw.Draw(img)
font=ImageFont.truetype(font="ARIALUNI.TTF", size=11, index=0)

draw.text((655, 255), TWW.q_TW, (0,0,0), font=font)

In der Variable TWW.q_TW ist der Wert gespeichert, den ich auf meinem Bild stehen haben möchte.
Folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\pittan\workspace\Norm\DIN4701\img.py", line 11, in <module>
    draw.text((655, 255), TWW.q_TW, (0,0,0), font=font)
  File "C:\Python27\lib\site-packages\PIL\ImageDraw.py", line 266, in text
    mask, offset = font.getmask2(text, self.fontmode)
  File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 152, in getmask2
    size, offset = self.font.getsize(text)
TypeError: expected string
Fehlt also ein string?! Wie soll ich also weiter machen?

Danke schonmal im voraus.
google hat mir bislang auch nicht weitergeholfen. Wahrscheinlich suche ich nach den falschen Sachen.

Gruß
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pittan: das Stichwort ist String-Formatierung und sollte in jedem Anfängertutorial ziemlich am Anfang vorkommen. Je nachdem wie Du die Ausgabe wünschst, mußt Du die Zahl in einen String umwandeln. Z.B:

Code: Alles auswählen

draw.text((655, 255), '{0:.3f}'.format(TWW.q_TW), (0,0,0), font=font)
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hallo,

vielen Dank, das hat mir wirklich sehr sehr weiter geholfen!

EDIT:
ich weiß, ich habe mich hier in diesem Forum bislang nicht mit Ruhm bekleckert - daher ziehe ich die letzte Frage zurück.

Trotzdem allen vielen Dank!


Danke
Gruß
Antworten