Seite 1 von 1

thumb_maker -> Mit PIL Thumbnails rekursiv erstellen...

Verfasst: Mittwoch 13. Juli 2005, 09:40
von jens
EDIT: Alte Version gelöscht. Siehe unten...

Verfasst: Mittwoch 13. Juli 2005, 10:44
von querdenker
Ä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

Verfasst: Mittwoch 13. Juli 2005, 10:53
von jens
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 ;)

Verfasst: Mittwoch 13. Juli 2005, 11:53
von jens
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()