#!/usr/bin/env python
"""Program for converting image files from one format
to another. Will convert one file at a time or all
files (of a selected format) in a directory at once.
Converted files have same basename as original files.
Uses workaround: askdirectory() does not allow choosing
a new dir, so asksaveasfilename() is used instead, and
the filename is discarded, keeping just the directory.
"""
import os, os.path, string, sys
from Tkinter import *
from tkFileDialog import *
import Image
openfile = '' # full pathname: dir(abs) + root + ext
indir = ''
outdir = ''
def getinfilename():
global openfile, indir
ftypes=(('Gif Images', '*.gif'),
('Jpeg Images', '*.jpg'),
('Png Images', '*.png'),
('Tiff Images', '*.tif'),
('Bitmap Images', '*.bmp'),
("All files", "*"))
if indir:
openfile = askopenfilename(initialdir=indir,
filetypes=ftypes)
else:
openfile = askopenfilename(filetypes=ftypes)
if openfile:
indir = os.path.dirname(openfile)
def getoutdirname():
global indir, outdir
if openfile:
indir = os.path.dirname(openfile)
outfile = asksaveasfilename(initialdir=indir,
initialfile='foo')
else:
outfile = asksaveasfilename(initialfile='foo')
outdir = os.path.dirname(outfile)
def save(infile, outfile):
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print "Cannot convert", infile
def convert():
newext = frmt.get()
path, file = os.path.split(openfile)
base, ext = os.path.splitext(file)
if var.get():
ls = os.listdir(indir)
filelist = []
for f in ls:
if os.path.splitext(f)[1] == ext:
filelist.append(f)
else:
filelist = [file]
for f in filelist:
infile = os.path.join(indir, f)
ofile = os.path.join(outdir, f)
outfile = os.path.splitext(ofile)[0] + newext
save(infile, outfile)
win = Toplevel(root)
Button(win, text='Done', command=win.destroy).pack()
# Divide GUI into 3 frames: top, mid, bot
root = Tk()
topframe = Frame(root,
borderwidth=2,
relief=GROOVE)
topframe.pack(padx=2, pady=2)
midframe = Frame(root,
borderwidth=2,
relief=GROOVE)
midframe.pack(padx=2, pady=2)
botframe = Frame(root)
botframe.pack()
Button(topframe,
text='Select image to convert',
command=getinfilename).pack(side=TOP, pady=4)
multitext = """Convert all image files
(of this format) in this folder?"""
var = IntVar()
chk = Checkbutton(topframe,
text=multitext,
variable=var).pack(pady=2)
Button(topframe,
text='Select save location',
command=getoutdirname).pack(side=BOTTOM, pady=4)
Label(midframe, text="New Format:").pack(side=LEFT)
frmt = StringVar()
formats = ['.bmp', '.gif', '.jpg', '.png', '.tif']
for item in formats:
Radiobutton(midframe,
text=item,
variable=frmt,
value=item).pack(anchor=NW)
Button(botframe, text='Convert', command=convert).pack(side=LEFT,
padx=5,
pady=5)
Button(botframe, text='Quit', command=root.quit).pack(side=RIGHT,
padx=5,
pady=5)
root.title('Image Converter')
root.mainloop()