Seite 1 von 1

PIL - ImageFont - ich sag nur Hilfe !!!

Verfasst: Donnerstag 19. Januar 2006, 10:01
von Gast
hallo folks,

hab da ein kleines problem und weiss seit 2 tagen googlen nicht mehr weiter ...

Code: Alles auswählen

font_grafik = ImageFont.truetype("arial.ttf", 15)
will einfach nicht funktionieren!!! mir würde notfalls auch ein code zum ändern der schriftgröße reichen. ich möchte lediglich in meinem durch pil erzeugten gif die schriftgrösse evtl. noch schriftart ändern!!!

hier noch der fehlercode:
[Thu Jan 19 09:42:23 2006] [error] [client 195.30....] font_grafik = ImageFont.truetype("arial.ttf", 15)
[Thu Jan 19 09:42:23 2006] [error] [client 195.30....] self.font = _imagingft.getfont(file, size, index, encoding), referer: http://devel.treibsand.com/
[Thu Jan 19 09:42:23 2006] [error] [client 195.30....] IOError, referer: http://devel.treibsand.com/

[Thu Jan 19 09:42:23 2006] [error] [client 195.30.1.131] File "/usr/lib/python2.3/site-packages/PIL/ImageFont.py", line 121, in __init__, referer: http://devel.treibsand.com/julian/ps_start.cgi :idea: :?:

für jegliche ideen oder hilfestellung wäre ich sehr dankbar. ich weiss das es mit der pil installation (ImageFont.py) zusammenhängen muss was aber genau weiss ich nicht ... :evil:

thx julian

Verfasst: Donnerstag 19. Januar 2006, 10:37
von jens
Aus meinem Thumb Proggi:

Code: Alles auswählen

            font_obj = ImageFont.truetype('arial.ttf', 12) # unter Linux ganzen Pfad angeben!
            ImageDraw.Draw( im_obj ).text( (10, 10), text, font=font_obj, fill=1 )

hmmm ... ne futzt net

Verfasst: Donnerstag 19. Januar 2006, 11:27
von julian
hi,

leider werde ich aus deinem post nicht schlau ... in linux (der webserver läuft unter linux) hab ich den kompl. pfad zu den ttf`s angegeben!

und das # PIL's Fehler "Suspension not allowed here" work around:
# s. http://mail.python.org/pipermail/image- ... 00816.html
import ImageFile
ImageFile.MAXBLOCK = 1000000 # default is 64k

aus deinem progr. hinzugefügt, wirft aber immer noch die gleichen feheler im error_log aus ... aus denen ich auch nicht schlau werde ...

könntest du mir vllt. genauer erklären woran das liegt?

thx julian

Verfasst: Donnerstag 19. Januar 2006, 11:31
von jens
Also mit dem "Suspension not allowed here" hat das nix zu tun. Kommt IMHO nur bei sehr großen Bildern vor...

Mach doch als erstes mal einen CGI-Traceback mit http://www.python.org/doc/current/lib/module-cgitb.html also füge oben in dein Skript folgendes ein:

Code: Alles auswählen

import cgitb; cgitb.enable()
Was spuckt der Python-Traceback denn aus???

hier mal der code

Verfasst: Donnerstag 19. Januar 2006, 11:37
von julian
so hier nochmal der code, welcher simple grafiken erstellen soll:

Code: Alles auswählen

font_grafik = ImageFont.truetype("usr/X11R6/lib/X11/fonts/TTF/arial.ttf", 17)

gg = -1
for direct in directs_clean:
  gg += 1
  im = Image.new("P", (125, 34), 0)
  draw = ImageDraw.Draw(im)
  draw.text((5, 13), "%s" % directs_clean[gg][0], fill=1) #-> font=font_grafik,
  im.info['transparency'] = 0
  im.rotate(90).save("grafik_spalten/%s.gif" % directs_clean[gg][0], "GIF", transparency=0)
und hier das error_log vom server:
[Thu Jan 19 11:22:01 2006] [error] font_grafik = ImageFont.truetype("usr/X11R6/lib/X11/fonts/TTF/arial.ttf", 17), referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] File "/usr/lib/python2.3/site-packages/PIL/ImageFont.py", line 202, in truetype, referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] , referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] return FreeTypeFont(filename, size, index, encoding), referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] File "/usr/lib/python2.3/site-packages/PIL/ImageFont.py", line 121, in __init__, referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] [client 195.30.1.131] , referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] self.font = _imagingft.getfont(file, size, index, encoding), referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] IOError, referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] : , referer: http://devel.treibsand.com/julian/ps_start.cgi
[Thu Jan 19 11:22:01 2006] [error] cannot open resource, referer: http://devel.treibsand.com/julian/ps_start.cgi

Re: hier mal der code

Verfasst: Donnerstag 19. Januar 2006, 11:38
von jens
julian hat geschrieben:und hier das error_log vom server:
Allerdings sagt der Error-Log nicht so viel, wie ein echter Traceback :)

traceback

Verfasst: Donnerstag 19. Januar 2006, 12:04
von julian
hi jens,
hier der traceback:

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.

/home/www/html-data/julian/ps_go.cgi
176 #------------------------#
177
178 font_grafik = ImageFont.truetype("usr/X11R6/lib/X11/fonts/TTF/arial.ttf", 17)
179
180 gg = -1
font_grafik undefined, ImageFont = <module 'PIL.ImageFont' from '/usr/lib/python2.3/site-packages/PIL/ImageFont.pyc'>, ImageFont.truetype = <function truetype>

/usr/lib/python2.3/site-packages/PIL/ImageFont.py in truetype(filename='usr/X11R6/lib/X11/fonts/TTF/arial.ttf', size=17, index=0, encoding='')
200 "Load a truetype font file."
201 try:
202 return FreeTypeFont(filename, size, index, encoding)
203 except IOError:
204 if sys.platform == "win32":
global FreeTypeFont = <class PIL.ImageFont.FreeTypeFont>, filename = 'usr/X11R6/lib/X11/fonts/TTF/arial.ttf', size = 17, index = 0, encoding = ''

/usr/lib/python2.3/site-packages/PIL/ImageFont.py in __init__(self=<PIL.ImageFont.FreeTypeFont instance>, file='usr/X11R6/lib/X11/fonts/TTF/arial.ttf', size=17, index=0, encoding='')
119 # FIXME: use service provider instead
120 import _imagingft
121 self.font = _imagingft.getfont(file, size, index, encoding)
122
123 def getname(self):
self = <PIL.ImageFont.FreeTypeFont instance>, self.font undefined, _imagingft = <module 'PIL._imagingft' from '/usr/lib/python2.3/site-packages/PIL/_imagingft.so'>, _imagingft.getfont = <built-in function getfont>, file = 'usr/X11R6/lib/X11/fonts/TTF/arial.ttf', size = 17, index = 0, encoding = ''

IOError: cannot open resource
args = ('cannot open resource',)
errno = None
filename = None
strerror = None

kannste mir da helfen bzw. hinweis geben???

thx

Verfasst: Donnerstag 19. Januar 2006, 12:13
von jens
Also ich würde sagen, das 'usr/X11R6/lib/X11/fonts/TTF/arial.ttf' nicht existiert... Mach doch einfach mal ein print os.path.isfile(...) um zu sehen, das die Datei auch wirklich existiert...

Kannst du wirklich auf die TTF Datei zugreifen? Wenn es als CGI läuft, läuft es i.d.R. mit User nobody, darf der auch darauf zugreifen??? Pack doch mal die Font Datei zum CGI-Skript und probiere es dann...

Hast du SSH Zugang? Dann würde ich es mal direkt auf dem Server testen...

Was dir vielleicht auch hilft, mach doch ein kleines Mini-Skript, nur mit der Aufgabe, wo der Fehler auftritt und versuche dann zu sehen, warum das nicht geht...

thx@jens

Verfasst: Donnerstag 19. Januar 2006, 13:06
von julian
Super,

1.000 x MERCI Jens ...
Ich hatte keine rechte auf dem Webserver für die TTF-Datei, hab jetzt per ssh und nach kurzem smalltalk mit dem Admin mir die benötigten TTf auf meinen webspace kopiert und siehe da alles funtzt.
Jaja die Welt könnte soooo einfach sein - konnte halt mit dem error_log und dem traceback null anfangen ...

Also many thx

mfg Julian

Verfasst: Donnerstag 19. Januar 2006, 13:07
von jens
Naja, '''IOError: cannot open resource''' deutet schon irgendwie drauf hin ;)

jaja

Verfasst: Donnerstag 19. Januar 2006, 13:16
von julian
hmm recht haste,

hat ein kollege grad auch gemeint ... aber find trotzdem dass der traceback nicht wirklich aussagekräftig ist. dachte die ganze zeit die pil wär hinünber oder nicht komplett ...

mfg

Verfasst: Donnerstag 19. Januar 2006, 16:50
von Leonidas
jens hat geschrieben:füge oben in dein Skript folgendes ein:

Code: Alles auswählen

import cgitb; cgitb.enable()
Warum in einer Zeile? Semikolons in Python sind so hässlich, in zwei Zeilen wäre das schöner.
Python Styleguide unter 'Rather not' hat geschrieben:do_one(); do_two(); do_three()

Verfasst: Donnerstag 19. Januar 2006, 16:51
von jens

Verfasst: Donnerstag 19. Januar 2006, 16:52
von Leonidas
jens hat geschrieben:Schau mal hier: http://www.python.org/doc/current/lib/module-cgitb.html 8)
Na und? Man muss ja nicht jedes Beispiel aus der Doku 1-zu-1 übernehmen.

Verfasst: Donnerstag 19. Januar 2006, 17:15
von jens
In dem Fall macht es für mich allerdings auch Sinn... Denn so kann man schnell mit nur einem # die Sache auskommentieren, hat also seine Vorteile... Dennoch stimme ich dir allgemein zu, ich selber mache auch sowas i.d.R. nicht... Außer vielleicht bei super keinen IF's wie if not var: return "" Aber das auch nur selten...

Re: hier mal der code

Verfasst: Freitag 20. Januar 2006, 00:31
von BlackJack
julian hat geschrieben:so hier nochmal der code, welcher simple grafiken erstellen soll:

Code: Alles auswählen

font_grafik = ImageFont.truetype("usr/X11R6/lib/X11/fonts/TTF/arial.ttf", 17)
Das ist aber kein *absoluter* Pfad. Vielleicht hätte es auch genügt das Wurzelverzeichnis, also einen "Slash" ganz am Anfang einzufügen.

Verfasst: Freitag 20. Januar 2006, 08:21
von jens
Stimmt... Aber darf nobody auf /usr/X11R6/lib/X11/fonts/TTF/ lesend zugreifen???

Verfasst: Freitag 20. Januar 2006, 22:13
von BlackJack
Bei mir ja. :-)

Wüsste auch nicht warum man das verbieten sollte.