thumb_maker -> Mit PIL Thumbnails rekursiv erstellen...

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

EDIT: Alte Version gelöscht. Siehe unten...
Zuletzt geändert von jens am Mittwoch 13. Juli 2005, 16:03, insgesamt 2-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Ähh, ja - Gemeinheit!

Ich hatte gerade angefangen, mir zu überlegen wie ein Thumb-Creator aussehen muss, da kommst du daher mit einer fertigen Lösung :wink:

Danke, querdenker
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich bastel allerdings gerade weiter dran rum...

Ich möchte neben den Thumbnails auch noch kleinere Versionen für's Web haben und in denen soll auch noch ein Text eingeblendet werden ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, nun die neue Version. Macht:

Erstellt kleineren Bilder für's Web, mit Texteinblendung. Macht Thumbnails. Außerdem werden die Dateinamen automatisch gecleant.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-

__author__      = "Jens Diemer"
__url__         = "http://www.jensdiemer.de/Programmieren/Python/Codesnippets"
__license__     = "GNU General Public License (GPL)"
__description__ = "makes thumbs with the PIL"

__version__ = "v0.0.2"

__history__ = """
v0.0.2
    - Patch für PIL's Fehler "Suspension not allowed here"
"""

import sys, os, time, fnmatch, urllib


# PIL - http://www.pythonware.com/products/pil/index.htm
import Image, ImageFont, ImageDraw

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



class thumb_maker_cfg:
    # Standardwerte
    path_to_convert   = os.getcwd()
    make_thumbs       = True
    thumb_size        = (160, 120)
    thumb_suffix      = "_thumb"

    make_smaller      = False
    smaller_size      = (640, 480)
    suffix            = "_WEB"
    image_text        = ""

    clean_filenames   = True

    rename_rules = [
        (" ", "_"),
        ("ä", "ae"),
        ("ö", "oe"),
        ("ü", "ue"),
        ("Ä", "Ae"),
        ("Ö", "Oe"),
        ("Ü", "Ue"),
        ("ß", "ss"),
    ]


class thumb_maker:
    def __init__( self, cfg ):
        self.cfg = cfg
        self.skip_file_pattern = [
            "*%s.*" % self.cfg.thumb_suffix,
            "*%s.*" % self.cfg.suffix
        ]

    def go( self ):
        """ Aktion starten """
        time_begin = time.time()
        print "work path:", self.cfg.path_to_convert

        for root,dirs,files in os.walk( self.cfg.path_to_convert ):
            print root
            print "_"*80
            for file_name in files:
                abs_file = os.path.join( self.cfg.path_to_convert, root, file_name )

                self.process_file( abs_file )

        print "-"*80
        print "all files converted in %0.2fsec." % (time.time() - time_begin)

    def process_file( self, abs_file ):
        path, im_name   = os.path.split( abs_file )
        try:
            im_obj = Image.open( abs_file )
        except IOError:
            # Ist wohl kein Bild, oder unbekanntes Format
            #~ print "Not a image, skip.\n"
            return

        print "%-40s - %4s %12s %s" % (
            im_name, im_obj.format, im_obj.size, im_obj.mode
        )

        if self.cfg.clean_filenames == True:
            # Dateinamen säubern
            im_name = self.clean_filename( im_name )

        # Kleinere Bilder für's Web erstellen
        if self.cfg.make_smaller == True:
            self.convert(
                im_obj      = im_obj,
                im_path     = path,
                im_name     = im_name,
                suffix      = self.cfg.suffix,
                size        = self.cfg.smaller_size,
                text        = self.cfg.image_text,
            )

        # Thumbnails erstellen
        if self.cfg.make_thumbs == True:
            self.convert(
                im_obj      = im_obj,
                im_path     = path,
                im_name     = im_name,
                suffix      = self.cfg.thumb_suffix,
                size        = self.cfg.thumb_size,
            )
        print "-"*3

    def convert( self,
        im_obj, # Das PIL-Image-Objekt
        im_path,# Der Pfad in dem das neue Bild gespeichert werden soll
        im_name,# Der vollständige Name der Source-Datei
        suffix, # Der Anhang für den Namen
        size,   # Die max. größe des Bildes als Tuple
        text="" # Text der unten rechts ins Bild eingeblendet wird
        ):
        """ Rechnet das Bild kleiner und fügt dazu den Text """

        name, ext       = os.path.splitext( im_name )
        out_name        = name + suffix + ".jpg"
        out_abs_name    = os.path.join( im_path, out_name )

        for skip_pattern in self.skip_file_pattern:
            if fnmatch.fnmatch( im_name, skip_pattern ):
                print "Skip file."
                return

        if os.path.isfile( out_abs_name ):
            print "File '%s' exists! Skip." % out_name
            return

        print "resize (max %ix%i)..." % size,
        im_obj.thumbnail( size, Image.ANTIALIAS )
        print "OK, real size %ix%i" % im_obj.size

        if im_obj.mode!="RGB":
            print "convert to RGB...",
            im_obj = im_obj.convert("RGB")
            print "OK"

        if text != "":
            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 )

        print "save '%s'..." % out_name,
        try:
            im_obj.save( out_abs_name, "JPEG", quality=85, optimize=1 )
            print "OK"
        except Exception, e:
            print "ERROR:", e

    def clean_filename( self, file_name ):
        """ Dateinamen für's Web säubern """

        if urllib.quote( file_name ) == file_name:
            # Gibt nix zu ersetzten!
            return file_name

        for rule in self.cfg.rename_rules:
            file_name = file_name.replace( rule[0], rule[1] )

        return urllib.quote( file_name )


if __name__ == "__main__":
    thumb_maker_cfg.path_to_convert = r"D:\MeineTollenBilder"
    thumb_maker_cfg.make_smaller    = True
    thumb_maker_cfg.image_text      = "www.python-forum.de ;)"

    thumb_maker( thumb_maker_cfg ).go()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten