PIL und resize

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.
Antworten
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

Mittwoch 10. August 2005, 10:33

Hallo!

Ich habe bei mir ein etwas merkwürdiges Verhalten der resize-Methode der PIL festgestellt. Wenn ich ein Bild mit resize verändern möchte kann ich ja auch einen Filter angeben. Nun möchte ich den BICUBIC-Filter verwenden und schreibe z.B.

Code: Alles auswählen

neues_bild = im.resize((128,128),BICUBIC)
Das funktioniert aber nicht und ich erhalte die Fehlermeldugn "unknown image filter" (so oder so ähnlich). Wenn ich allerdings

Code: Alles auswählen

neues_bild = im.resize((128,128),2)
benutze dann klapp alles ohne Probleme. (BICUBIC wird in der Image.py der PIL nämlich auf den Wert 2 gesetzt.)

Mache ich was falsch? Kann jemand dieses Verhalten bestätigen?

(Ich benutze Python 2.4 und PIL 1.1.5 unter Slackware 10.1)

Viele Dank schon mal

Jörg Gollers
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Mittwoch 10. August 2005, 11:04

Wenn du nicht "from foobar import *" verwendet hast, musst du natürlich im.BICUBIC schreiben.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 10. August 2005, 12:16

Ich nehme statt resize einfach: im_obj.thumbnail( (640, 480), Image.ANTIALIAS )

Wobei das Ergibnis natürlich ein anderes ist! thumbnail behält die Proportionen eines Bildes bei, resize macht das nicht.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

Mittwoch 10. August 2005, 15:56

Joghurt hat geschrieben:Wenn du nicht "from foobar import *" verwendet hast, musst du natürlich im.BICUBIC schreiben.
Das kann natürlich sein (Danke für den Tip). Ich werde es heute abend gleich mal ausprobieren.
jens hat geschrieben:Wobei das Ergibnis natürlich ein anderes ist! thumbnail behält die Proportionen eines Bildes bei, resize macht das nicht.
Noch eine kleine Bemerkung: Mein Skript berücksichtig dies bereits. Es vergrößert bzw. verkleinert die Bilddateien (Fotos) so, daß diese genau auf die Auflösung 800x600 zugeschnitten sind. (Entweder hat das Foto dann eine Breite von 800 oder eine Höhe von 600 Pixeln). Die die jeweils andere Koordinate wird natürlich mit dem gleichen Faktor skaliert.

Jörg Gollers
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 10. August 2005, 15:58

jgollers hat geschrieben:Mein Skript berücksichtig dies bereits.
Das heißt also, du machst es per Hand??? Also du berechnest die resize Werte, so das es proportional ist?
Dann könntest du gleich die thumbnail-Funktion bnutzen, dann hast du einiges an Arbeit gespart, bzw. kannst du wieder in den Sourcen wegschmeißen ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

Freitag 12. August 2005, 08:50

Joghurt hat geschrieben: Wenn du nicht "from foobar import *" verwendet hast, musst du natürlich im.BICUBIC schreiben.
Es war natürlich ein Namespace-Bug (mit Image.BICUBIC) funktioniert es jetzt!
jens hat geschrieben:Das heißt also, du machst es per Hand??? Also du berechnest die resize Werte, so das es proportional ist?
Ja, das mach' ich so und zwar weil in der PIL-Soku steht
Modifies the image to contain a thumbnail version of itself, no larger than the given size.
Da ich aber auch vergrößere, scheint thumbnail nicht das richtige zu sein (oder kann man da auch vergrößern?).

Außerdem müßte ich bei thumbmail auch zunächst ermitteln, ob das Bild breiter als hoch bzw. höher als breit ist (oder etwa nicht?).

Ich werde als Programm nicht ändern um evtl. eine Zeile einzusparen!

Jörg Gollers

ps: Ach ja, das Programm kontrolliert natürlich auch, ob es sich wirklich um JPG's handelt und nimmt ggf. eine Konvertierung vor.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 12. August 2005, 11:10

jgollers hat geschrieben:Da ich aber auch vergrößere, scheint thumbnail nicht das richtige zu sein (oder kann man da auch vergrößern?).
Also ich bin kein PIL experte, von daher weiß ich nicht ob es geht, aber wenn es in der Doku steht, das es nicht geht, wird es schon so sein ;)
Allerdings denke ich, das es nie Sinn macht Bilder hochzurechnen! Warum mast du sowas?
jgollers hat geschrieben:Außerdem müßte ich bei thumbmail auch zunächst ermitteln, ob das Bild breiter als hoch bzw. höher als breit ist (oder etwa nicht?).
Nö, eigentlich nicht! Wenn du sagst, mach mir ein Thumbnail mit max 800x600, dann verkleindert PIL das Source-Bild halt so, das diese Werte nicht überschritten wird. Egal ob es nun Hochformat ist oder nicht.
jgollers hat geschrieben:ps: Ach ja, das Programm kontrolliert natürlich auch, ob es sich wirklich um JPG's handelt und nimmt ggf. eine Konvertierung vor.
Also in meiner Lösung muß ich jediglich das machen:

Code: Alles auswählen

        if im_obj.mode!="RGB":
            print "convert to RGB...",
            im_obj = im_obj.convert("RGB")
            print "OK" 
Ansosten kann alles konvertiert werden, was PIL importieren kann!

Am besten schaust du dir mal mein Listing an:
http://www.python-forum.de/viewtopic.php?p=21021#21021

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Montag 15. August 2005, 09:08

jens hat geschrieben:Allerdings denke ich, das es nie Sinn macht Bilder hochzurechnen! Warum mast du sowas?
Weil das eine Vorgabe war. (Ist nicht auf meinem Mist gewachsen). In der Regel werden aber Verkleinerungen vorgenommen (95%).
jens hat geschrieben:Am besten schaust du dir mal mein Listing an:
http://www.python-forum.de/viewtopic.php?p=21021#21021
Ja, hab' ich gemacht. Schönes Programm, aber mein Programm läuft nun und macht das was es tun soll. (Also gilt "never change a running program"!)

Vielen Dank noch für die Hilfe


Jörg Gollers
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

Montag 15. August 2005, 09:13

...und an dem vorherigen Betrag sehen wir mal wieder, daß dieses Forum (die Software) mich nicht mag... (ich wurde automatisch abgemeldet)

Jörg Gollers
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Montag 15. August 2005, 14:16

jgollers hat geschrieben:
Modifies the image to contain a thumbnail version of itself, no larger than the given size.
Da ich aber auch vergrößere, scheint thumbnail nicht das richtige zu sein (oder kann man da auch vergrößern?).
Das heisst, dass das Bild nicht größer sein wird, als die von dir angegebene Größe, es u.U. (z.B. wegen dem Seitenverhältnis) kleiner als angegeben wird.

Beispiel: wenn du bei einem 100x100 Bild als Größe 400x300 angibst, wird es wahrscheinlich auf 300x300 gestreckt.
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

Dienstag 16. August 2005, 16:05

Joghurt hat geschrieben:Das heisst, dass das Bild nicht größer sein wird, als die von dir angegebene Größe, es u.U. (z.B. wegen dem Seitenverhältnis) kleiner als angegeben wird.

Beispiel: wenn du bei einem 100x100 Bild als Größe 400x300 angibst, wird es wahrscheinlich auf 300x300 gestreckt.
So, so ... nun hab' ich verstanden!

Jörg Gollers
brauerle
User
Beiträge: 7
Registriert: Samstag 7. Oktober 2006, 11:04
Kontaktdaten:

Samstag 11. November 2006, 14:34

Hallo,

ist es denn möglich, der resize bzw thumbnail Funktion noch Parameter für die JPEG Kompression mitanzugeben? Ich krieg immer ziemliche Artefakte, da zu stark komprimiert wird.

Gruß.
BlackJack

Samstag 11. November 2006, 15:01

Die Kompression wird erst beim Speichern wirksam. Bei JPEG kann man `save()` eine `quality` Option mitgeben.

http://www.pythonware.com/library/pil/h ... t-jpeg.htm
Antworten