Python Imaging Library (PIL) op Mac OS X inclusief libjpeg en freetype2

Saturday 02 August 2008, 02:13:00 | python

Ik wilde image manipulatie doen vanuit Python op mijn Mac. Dan kom je zo'n beetje automatisch op PIL uit.

Hieronder heb ik beschreven hoe je PIL zelf compileert met de juiste libraries erbij (PNG/JPEG/FREETYPE). Zoals ik het hier heb beschreven werkt het op mijn PowerPC MAC Mini met OS X 10.4 (Tiger), maar ik verwacht dat het op nieuwere Macs ook gewoon werkt.

Benodigdheden:

  1. Compile & install libjpeg De actuele versie is libjpeg v8a.
    $ curl -o jpegsrc.v8a.tar.gz http://www.ijg.org/files/jpegsrc.v8a.tar.gz
    $ tar xzf jpegsrc.v8a.tar.gz
    $ cd jpeg-8a
    $ ./configure --enable-shared --enable-static
    $ make
    $ sudo make install

  2. Compile & install freetype2 De actuele versie is 2.3.12.

    $ curl -o freetype-2.3.12.tar.bz2 http://mirrors.aixtools.net/sv/freetype/freetype-2.3.12.tar.bz2
    $ tar xjf freetype-2.3.12.tar.bz2 
    $ cd freetype-2.3.12

    (>) Als je truetype hinting en subpixel rendering wilt, moet je een paar #defines aanzetten in een headerfile. Zie docs/TRUETYPE voor details. Als dit gedaan is kun je gaan compileren:

    $ ./configure --enable-shared --enable-static
    $ make
    $ sudo make install

  3. Compile & install PIL De actuele versie is 1.1.7.

    $ curl -o PIL-Imaging-1.1.7.tar.gz http://effbot.org/media/downloads/PIL-1.1.7.tar.gz
    $ tar xzf PIL-Imaging-1.1.7.tar.gz
    $ cd PIL-1.1.7
    $ python setup.py build

    Er zou nu een soort van status rapport moeten staan met JPEG/PNG/FREETYPE op available.

    $ sudo python setup.py install
    $ python selftest.py

    De selftest moet foutloos verlopen en iets zeggen als "57 tests passed". Er lijken wat foutjes in te zitten over modules die niet beschikbaar zouden zijn maar ik vermoed dat de test niet helemaal lekker is, want de testcases doen het wel gewoon.

Hier nog een klein testprogje dat een plaatje rendert met wat tekst erin en het opslaat in jpeg, gif en png formaat:

import Image
import ImageDraw
import ImageFont

def getFont():
    for path in [ "arial.ttf", "/System/Library/Fonts/Helvetica.dfont",
        "/Library/Fonts/Arial.ttf", "c:/windows/fonts/arial.ttf",
	"/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf" ]:
        try:
            return ImageFont.truetype(path,30)
        except:
            pass
    raise RuntimeError("PIL could not load an appropriate font")

img=Image.new("RGBA",(100,100))
draw=ImageDraw.Draw(img)
font=getFont()
print "using font:", font.getname()
draw.ellipse((0,0,100,100),fill="#ff0000",outline="#ffff00")
draw.line((0,0,100,100),"#00ff00",width=3)
draw.line((100,0,0,100),"#0000ff",width=3)
draw.text((10,30),"Hello!",font=font, fill="#ffffff")
img.save("testpic.jpg","JPEG",quality=90)
img.save("testpic.png","PNG")
img.save("testpic.gif","GIF")

i1=Image.open("testpic.jpg")
i2=Image.open("testpic.png")
i3=Image.open("testpic.gif")

print "PIL tests passed (libfreetype/ttf font rendering, jpeg/gif/png image formats)."