yet another simple static gallery generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

183 lines
6.2 KiB

#! /usr/bin/env python2
# -*- coding:utf-8 -*-
# pywiUpload - Piwigo gallery generator
# Copyright (C) 2009-2011 Simon - saimon.org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; If not, see http://www.gnu.org/licenses/
"""Create a gallery of images.
Resize images, create thumbnails with some options (rename images, squared
thumbs, ...).
"""
import os
import Image
import ImageDraw
from utils import get_filelist
class Gallery:
"Prepare a gallery of images for Piwigo"
def __init__(self, params):
self.filepath = ""
self.galname = ""
self.params = params
def getpath(self, pathname):
"return abslolute path from params dict"
return os.path.join(self.filepath, self.params[pathname]) \
if self.params.has_key(pathname) else ""
def create_gallery(self, path):
"create image gallery"
imglist = get_filelist(path, self.params['fileExtList'])
print "Found %i images in %s" % (len(imglist), path)
while self.galname == "":
self.galname = raw_input('Enter gallery name: ')
self.filepath = os.path.join(os.path.dirname(imglist[0]),
self.galname)
print "Create output dir ..."
try:
os.makedirs(self.getpath('thumb_dir'))
except OSError:
pass
if self.params['bigimg']:
try:
os.mkdir(self.getpath('bigimg_dir'))
except OSError:
pass
return (self.galname, self.process_images(imglist))
def process_images(self, imglist):
"prepare images"
imglist.sort()
out_imglist = []
out_thumblist = []
out_bigimglist = []
imrename = raw_input("Rename images ('name01.jpg') ? (y/[n]) ")
if imrename == 'y':
count = 1
imgname = raw_input('Enter new image name: ')
nfill = 2 if (len(imglist)<100) else 3
if self.params['copyright']:
copyrightmsg = raw_input('Enter copyright message: ')
copyrightmsg = '\xa9 ' + copyrightmsg
# loop on images
for f in imglist:
filename = os.path.split(f)[1]
im = Image.open(f)
if imrename == 'y':
filename = imgname+str(count).zfill(nfill)+'.jpg'
print "%s > %s" % (os.path.split(f)[1], filename)
count += 1
else:
print "%s" % filename
if self.params['bigimg']:
im.save(os.path.join(self.getpath('bigimg_dir'), filename),
quality=self.params['jpgquality'])
out_bigimglist.append(os.path.join(self.getpath('bigimg_dir'),
filename))
# resize image
if im.size[0] > im.size[1]:
im_size = (self.params['im_width'], self.params['im_height'])
else:
im_size = (self.params['im_height'], self.params['im_width'])
im2 = im.resize(im_size, Image.ANTIALIAS)
# create thumbnail
if self.params['squarethumb']:
if im.size[0] > im.size[1]:
offset = (im.size[0] - im.size[1])/2
box = (offset, 0, im.size[0]-offset, im.size[1])
else:
offset = (im.size[1] - im.size[0])/2
box = (0, offset, im.size[0], im.size[1]-offset)
im = im.crop(box)
thumbsize = (self.params['thumb_width'],
self.params['thumb_width'])
else:
thumbsize = (self.params['thumb_width'],
self.params['thumb_height'])
im.thumbnail(thumbsize, Image.ANTIALIAS)
# copyright
if self.params['copyright']:
draw = ImageDraw.Draw(im2)
draw.text((5, im2.size[1]-15), copyrightmsg)
# save
im.save(os.path.join(self.getpath('thumb_dir'),
self.params['thumb_prefix']+filename),
quality=self.params['jpgquality'])
im2.save(os.path.join(self.filepath, filename),
quality=self.params['jpgquality'])
out_thumblist.append(os.path.join(self.getpath('thumb_dir'),
self.params['thumb_prefix']+
filename))
out_imglist.append(os.path.join(self.filepath, filename))
if self.params['exif']:
self.process_exif(f, os.path.join(self.filepath, filename))
return [out_imglist, out_thumblist, out_bigimglist]
def process_exif(self, srcfile, dstfile):
"copy exif metadatas from src to dest images"
try:
import pyexiv2
except ImportError:
self.params['exif'] = 0
print "Error: install pyexiv2 module to use exif metadatas."
return
if pyexiv2.version_info[1] == 1:
src = pyexiv2.Image(srcfile)
dst = pyexiv2.Image(dstfile)
src.readMetadata()
dst.readMetadata()
try:
src.copyMetadataTo(dst)
except:
print "Error: metadata not copied for %s." % srcfile
return
dst.writeMetadata()
else:
src = pyexiv2.ImageMetadata(srcfile)
dst = pyexiv2.ImageMetadata(dstfile)
src.read()
dst.read()
try:
src.copy(dst)
except:
print "Error: metadata not copied for %s." % srcfile
return
dst.write()