From 097ebf7fb667563d55776668a9bafe6728943076 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 21 Dec 2017 21:36:22 +0000 Subject: [PATCH] Removed scripts directory, added to it's own package See https://github.com/python-pillow/pillow-scripts --- Scripts/README.rst | 65 ----- Scripts/enhancer.py | 64 ----- Scripts/explode.py | 112 --------- Scripts/gifmaker.py | 31 --- Scripts/painter.py | 84 ------- Scripts/pilconvert.py | 99 -------- Scripts/pildriver.py | 526 ----------------------------------------- Scripts/pilfile.py | 101 -------- Scripts/pilfont.py | 57 ----- Scripts/pilprint.py | 102 -------- Scripts/player.py | 94 -------- Scripts/thresholder.py | 80 ------- Scripts/viewer.py | 55 ----- setup.py | 2 - 14 files changed, 1472 deletions(-) delete mode 100644 Scripts/README.rst delete mode 100755 Scripts/enhancer.py delete mode 100755 Scripts/explode.py delete mode 100755 Scripts/gifmaker.py delete mode 100755 Scripts/painter.py delete mode 100755 Scripts/pilconvert.py delete mode 100755 Scripts/pildriver.py delete mode 100755 Scripts/pilfile.py delete mode 100755 Scripts/pilfont.py delete mode 100755 Scripts/pilprint.py delete mode 100755 Scripts/player.py delete mode 100755 Scripts/thresholder.py delete mode 100755 Scripts/viewer.py diff --git a/Scripts/README.rst b/Scripts/README.rst deleted file mode 100644 index c8b06d59c..000000000 --- a/Scripts/README.rst +++ /dev/null @@ -1,65 +0,0 @@ -Scripts -======= - -This directory contains a number of more or less trivial utilities -and demo programs. - -Comments and contributions are welcome. - - - -pildriver.py (by Eric S. Raymond) --------------------------------------------------------------------- - -A class implementing an image-processing calculator for scripts. -Parses lists of commands (or, called interactively, command-line -arguments) into image loads, transformations, and saves. - -viewer.py --------------------------------------------------------------------- - -A simple image viewer. Can display all file formats handled by -PIL. Transparent images are properly handled. - -thresholder.py --------------------------------------------------------------------- - -A simple utility that demonstrates how a transparent 1-bit overlay -can be used to show the current thresholding of an 8-bit image. - -enhancer.py --------------------------------------------------------------------- - -Illustrates the ImageEnhance module. Drag the sliders to modify the -images. This might be very slow on some platforms, depending on the -Tk version. - -painter.py --------------------------------------------------------------------- - -Illustrates how a painting program could be based on PIL and Tk. -Press the left mouse button and drag over the image to remove the -colour. Some clever tricks have been used to get decent performance -when updating the screen; see the sources for details. - -player.py --------------------------------------------------------------------- - -A simple image sequence player. You can use either a sequence format -like FLI/FLC, GIF, or ARG, or give a number of images which are -interpreted as frames in a sequence. All frames must have the same -size. - -gifmaker.py --------------------------------------------------------------------- - -Convert a sequence file to a GIF animation. - -Note that the GIF encoder provided with this release of PIL writes -uncompressed GIF files only, so the resulting animations are rather -large compared with these created by other tools. - -explode.py --------------------------------------------------------------------- - -Split a sequence file into individual frames. diff --git a/Scripts/enhancer.py b/Scripts/enhancer.py deleted file mode 100755 index ee333974f..000000000 --- a/Scripts/enhancer.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# -# this demo script creates four windows containing an image and a slider. -# drag the slider to modify the image. -# - -import sys - -if sys.version_info[0] > 2: - import tkinter -else: - import Tkinter as tkinter - -from PIL import Image, ImageTk, ImageEnhance - -# -# enhancer widget - - -class Enhance(tkinter.Frame): - def __init__(self, master, image, name, enhancer, lo, hi): - tkinter.Frame.__init__(self, master) - - # set up the image - self.tkim = ImageTk.PhotoImage(image.mode, image.size) - self.enhancer = enhancer(image) - self.update("1.0") # normalize - - # image window - tkinter.Label(self, image=self.tkim).pack() - - # scale - s = tkinter.Scale(self, label=name, orient=tkinter.HORIZONTAL, - from_=lo, to=hi, resolution=0.01, - command=self.update) - s.set(self.value) - s.pack() - - def update(self, value): - self.value = float(value) - self.tkim.paste(self.enhancer.enhance(self.value)) - -# -# main - -if len(sys.argv) != 2: - print("Usage: enhancer file") - sys.exit(1) - -root = tkinter.Tk() - -im = Image.open(sys.argv[1]) - -im.thumbnail((200, 200)) - -Enhance(root, im, "Color", ImageEnhance.Color, 0.0, 4.0).pack() -Enhance(tkinter.Toplevel(), im, "Sharpness", ImageEnhance.Sharpness, -2.0, 2.0).pack() -Enhance(tkinter.Toplevel(), im, "Brightness", ImageEnhance.Brightness, -1.0, 3.0).pack() -Enhance(tkinter.Toplevel(), im, "Contrast", ImageEnhance.Contrast, -1.0, 3.0).pack() - -root.mainloop() diff --git a/Scripts/explode.py b/Scripts/explode.py deleted file mode 100755 index 53436100b..000000000 --- a/Scripts/explode.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# -# split an animation into a number of frame files -# - -from __future__ import print_function - -from PIL import Image -import os -import sys - - -class Interval(object): - - def __init__(self, interval="0"): - - self.setinterval(interval) - - def setinterval(self, interval): - - self.hilo = [] - - for s in interval.split(","): - if not s.strip(): - continue - try: - v = int(s) - if v < 0: - lo, hi = 0, -v - else: - lo = hi = v - except ValueError: - i = s.find("-") - lo, hi = int(s[:i]), int(s[i+1:]) - - self.hilo.append((hi, lo)) - - if not self.hilo: - self.hilo = [(sys.maxsize, 0)] - - def __getitem__(self, index): - - for hi, lo in self.hilo: - if hi >= index >= lo: - return 1 - return 0 - -# -------------------------------------------------------------------- -# main program - -html = 0 - -if sys.argv[1:2] == ["-h"]: - html = 1 - del sys.argv[1] - -if not sys.argv[2:]: - print() - print("Syntax: python explode.py infile template [range]") - print() - print("The template argument is used to construct the names of the") - print("individual frame files. The frames are numbered file001.ext,") - print("file002.ext, etc. You can insert %d to control the placement") - print("and syntax of the frame number.") - print() - print("The optional range argument specifies which frames to extract.") - print("You can give one or more ranges like 1-10, 5, -15 etc. If") - print("omitted, all frames are extracted.") - sys.exit(1) - -infile = sys.argv[1] -outfile = sys.argv[2] - -frames = Interval(",".join(sys.argv[3:])) - -try: - # check if outfile contains a placeholder - outfile % 1 -except TypeError: - file, ext = os.path.splitext(outfile) - outfile = file + "%03d" + ext - -ix = 1 - -im = Image.open(infile) - -if html: - file, ext = os.path.splitext(outfile) - html = open(file+".html", "w") - html.write("\n\n") - -while True: - - if frames[ix]: - im.save(outfile % ix) - print(outfile % ix) - - if html: - html.write("
\n" % outfile % ix) - - try: - im.seek(ix) - except EOFError: - break - - ix += 1 - -if html: - html.write("\n\n") diff --git a/Scripts/gifmaker.py b/Scripts/gifmaker.py deleted file mode 100755 index c0679ca79..000000000 --- a/Scripts/gifmaker.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# -# convert sequence format to GIF animation -# -# history: -# 97-01-03 fl created -# -# Copyright (c) Secret Labs AB 1997. All rights reserved. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -from __future__ import print_function - -from PIL import Image - -if __name__ == "__main__": - - import sys - - if len(sys.argv) < 3: - print("GIFMAKER -- create GIF animations") - print("Usage: gifmaker infile outfile") - sys.exit(1) - - im = Image.open(sys.argv[1]) - im.save(sys.argv[2], save_all=True) diff --git a/Scripts/painter.py b/Scripts/painter.py deleted file mode 100755 index 30d55c2b6..000000000 --- a/Scripts/painter.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# -# this demo script illustrates pasting into an already displayed -# photoimage. note that the current version of Tk updates the whole -# image every time we paste, so to get decent performance, we split -# the image into a set of tiles. -# - -import sys - -if sys.version_info[0] > 2: - import tkinter -else: - import Tkinter as tkinter - -from PIL import Image, ImageTk - -# -# painter widget - - -class PaintCanvas(tkinter.Canvas): - def __init__(self, master, image): - tkinter.Canvas.__init__(self, master, - width=image.size[0], height=image.size[1]) - - # fill the canvas - self.tile = {} - self.tilesize = tilesize = 32 - xsize, ysize = image.size - for x in range(0, xsize, tilesize): - for y in range(0, ysize, tilesize): - box = x, y, min(xsize, x+tilesize), min(ysize, y+tilesize) - tile = ImageTk.PhotoImage(image.crop(box)) - self.create_image(x, y, image=tile, anchor=tkinter.NW) - self.tile[(x, y)] = box, tile - - self.image = image - - self.bind("", self.paint) - - def paint(self, event): - xy = event.x - 10, event.y - 10, event.x + 10, event.y + 10 - im = self.image.crop(xy) - - # process the image in some fashion - im = im.convert("L") - - self.image.paste(im, xy) - self.repair(xy) - - def repair(self, box): - # update canvas - dx = box[0] % self.tilesize - dy = box[1] % self.tilesize - for x in range(box[0]-dx, box[2]+1, self.tilesize): - for y in range(box[1]-dy, box[3]+1, self.tilesize): - try: - xy, tile = self.tile[(x, y)] - tile.paste(self.image.crop(xy)) - except KeyError: - pass # outside the image - self.update_idletasks() - -# -# main - -if len(sys.argv) != 2: - print("Usage: painter file") - sys.exit(1) - -root = tkinter.Tk() - -im = Image.open(sys.argv[1]) - -if im.mode != "RGB": - im = im.convert("RGB") - -PaintCanvas(root, im).pack() - -root.mainloop() diff --git a/Scripts/pilconvert.py b/Scripts/pilconvert.py deleted file mode 100755 index b9ebd52ae..000000000 --- a/Scripts/pilconvert.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library. -# $Id$ -# -# convert image files -# -# History: -# 0.1 96-04-20 fl Created -# 0.2 96-10-04 fl Use draft mode when converting images -# 0.3 96-12-30 fl Optimize output (PNG, JPEG) -# 0.4 97-01-18 fl Made optimize an option (PNG, JPEG) -# 0.5 98-12-30 fl Fixed -f option (from Anthony Baxter) -# - -from __future__ import print_function - -import getopt -import string -import sys - -from PIL import Image - - -def usage(): - print("PIL Convert 0.5/1998-12-30 -- convert image files") - print("Usage: pilconvert [option] infile outfile") - print() - print("Options:") - print() - print(" -c convert to format (default is given by extension)") - print() - print(" -g convert to greyscale") - print(" -p convert to palette image (using standard palette)") - print(" -r convert to rgb") - print() - print(" -o optimize output (trade speed for size)") - print(" -q set compression quality (0-100, JPEG only)") - print() - print(" -f list supported file formats") - sys.exit(1) - -if len(sys.argv) == 1: - usage() - -try: - opt, argv = getopt.getopt(sys.argv[1:], "c:dfgopq:r") -except getopt.error as v: - print(v) - sys.exit(1) - -output_format = None -convert = None - -options = {} - -for o, a in opt: - - if o == "-f": - Image.init() - id = sorted(Image.ID) - print("Supported formats (* indicates output format):") - for i in id: - if i in Image.SAVE: - print(i+"*", end=' ') - else: - print(i, end=' ') - sys.exit(1) - - elif o == "-c": - output_format = a - - if o == "-g": - convert = "L" - elif o == "-p": - convert = "P" - elif o == "-r": - convert = "RGB" - - elif o == "-o": - options["optimize"] = 1 - elif o == "-q": - options["quality"] = string.atoi(a) - -if len(argv) != 2: - usage() - -try: - im = Image.open(argv[0]) - if convert and im.mode != convert: - im.draft(convert, im.size) - im = im.convert(convert) - if output_format: - im.save(argv[1], output_format, **options) - else: - im.save(argv[1], **options) -except: - print("cannot convert image", end=' ') - print("(%s:%s)" % (sys.exc_info()[0], sys.exc_info()[1])) diff --git a/Scripts/pildriver.py b/Scripts/pildriver.py deleted file mode 100755 index cc425ad08..000000000 --- a/Scripts/pildriver.py +++ /dev/null @@ -1,526 +0,0 @@ -#!/usr/bin/env python -"""PILdriver, an image-processing calculator using PIL. - -An instance of class PILDriver is essentially a software stack machine -(Polish-notation interpreter) for sequencing PIL image -transformations. The state of the instance is the interpreter stack. - -The only method one will normally invoke after initialization is the -`execute' method. This takes an argument list of tokens, pushes them -onto the instance's stack, and then tries to clear the stack by -successive evaluation of PILdriver operators. Any part of the stack -not cleaned off persists and is part of the evaluation context for -the next call of the execute method. - -PILDriver doesn't catch any exceptions, on the theory that these -are actually diagnostic information that should be interpreted by -the calling code. - -When called as a script, the command-line arguments are passed to -a PILDriver instance. If there are no command-line arguments, the -module runs an interactive interpreter, each line of which is split into -space-separated tokens and passed to the execute method. - -In the method descriptions below, a first line beginning with the string -`usage:' means this method can be invoked with the token that follows -it. Following <>-enclosed arguments describe how the method interprets -the entries on the stack. Each argument specification begins with a -type specification: either `int', `float', `string', or `image'. - -All operations consume their arguments off the stack (use `dup' to -keep copies around). Use `verbose 1' to see the stack state displayed -before each operation. - -Usage examples: - - `show crop 0 0 200 300 open test.png' loads test.png, crops out a portion -of its upper-left-hand corner and displays the cropped portion. - - `save rotated.png rotate 30 open test.tiff' loads test.tiff, rotates it -30 degrees, and saves the result as rotated.png (in PNG format). -""" -# by Eric S. Raymond -# $Id$ - -# TO DO: -# 1. Add PILFont capabilities, once that's documented. -# 2. Add PILDraw operations. -# 3. Add support for composing and decomposing multiple-image files. -# - -from __future__ import print_function - -from PIL import Image - - -class PILDriver(object): - - verbose = 0 - - def do_verbose(self): - """usage: verbose - - Set verbosity flag from top of stack. - """ - self.verbose = int(self.do_pop()) - - # The evaluation stack (internal only) - - stack = [] # Stack of pending operations - - def push(self, item): - "Push an argument onto the evaluation stack." - self.stack.insert(0, item) - - def top(self): - "Return the top-of-stack element." - return self.stack[0] - - # Stack manipulation (callable) - - def do_clear(self): - """usage: clear - - Clear the stack. - """ - self.stack = [] - - def do_pop(self): - """usage: pop - - Discard the top element on the stack. - """ - return self.stack.pop(0) - - def do_dup(self): - """usage: dup - - Duplicate the top-of-stack item. - """ - if hasattr(self, 'format'): # If it's an image, do a real copy - dup = self.stack[0].copy() - else: - dup = self.stack[0] - self.push(dup) - - def do_swap(self): - """usage: swap - - Swap the top-of-stack item with the next one down. - """ - self.stack = [self.stack[1], self.stack[0]] + self.stack[2:] - - # Image module functions (callable) - - def do_new(self): - """usage: new : - - Create and push a greyscale image of given size and color. - """ - xsize = int(self.do_pop()) - ysize = int(self.do_pop()) - color = int(self.do_pop()) - self.push(Image.new("L", (xsize, ysize), color)) - - def do_open(self): - """usage: open - - Open the indicated image, read it, push the image on the stack. - """ - self.push(Image.open(self.do_pop())) - - def do_blend(self): - """usage: blend - - Replace two images and an alpha with the blended image. - """ - image1 = self.do_pop() - image2 = self.do_pop() - alpha = float(self.do_pop()) - self.push(Image.blend(image1, image2, alpha)) - - def do_composite(self): - """usage: composite - - Replace two images and a mask with their composite. - """ - image1 = self.do_pop() - image2 = self.do_pop() - mask = self.do_pop() - self.push(Image.composite(image1, image2, mask)) - - def do_merge(self): - """usage: merge - [ [ []]] - - Merge top-of stack images in a way described by the mode. - """ - mode = self.do_pop() - bandlist = [] - for band in mode: - bandlist.append(self.do_pop()) - self.push(Image.merge(mode, bandlist)) - - # Image class methods - - def do_convert(self): - """usage: convert - - Convert the top image to the given mode. - """ - mode = self.do_pop() - image = self.do_pop() - self.push(image.convert(mode)) - - def do_copy(self): - """usage: copy - - Make and push a true copy of the top image. - """ - self.dup() - - def do_crop(self): - """usage: crop - - - Crop and push a rectangular region from the current image. - """ - left = int(self.do_pop()) - upper = int(self.do_pop()) - right = int(self.do_pop()) - lower = int(self.do_pop()) - image = self.do_pop() - self.push(image.crop((left, upper, right, lower))) - - def do_draft(self): - """usage: draft - - Configure the loader for a given mode and size. - """ - mode = self.do_pop() - xsize = int(self.do_pop()) - ysize = int(self.do_pop()) - self.push(self.draft(mode, (xsize, ysize))) - - def do_filter(self): - """usage: filter - - Process the top image with the given filter. - """ - from PIL import ImageFilter - imageFilter = getattr(ImageFilter, self.do_pop().upper()) - image = self.do_pop() - self.push(image.filter(imageFilter)) - - def do_getbbox(self): - """usage: getbbox - - Push left, upper, right, and lower pixel coordinates of the top image. - """ - bounding_box = self.do_pop().getbbox() - self.push(bounding_box[3]) - self.push(bounding_box[2]) - self.push(bounding_box[1]) - self.push(bounding_box[0]) - - def do_getextrema(self): - """usage: extrema - - Push minimum and maximum pixel values of the top image. - """ - extrema = self.do_pop().extrema() - self.push(extrema[1]) - self.push(extrema[0]) - - def do_offset(self): - """usage: offset - - Offset the pixels in the top image. - """ - xoff = int(self.do_pop()) - yoff = int(self.do_pop()) - image = self.do_pop() - self.push(image.offset(xoff, yoff)) - - def do_paste(self): - """usage: paste - - - Paste figure image into ground with upper left at given offsets. - """ - figure = self.do_pop() - xoff = int(self.do_pop()) - yoff = int(self.do_pop()) - ground = self.do_pop() - if figure.mode == "RGBA": - ground.paste(figure, (xoff, yoff), figure) - else: - ground.paste(figure, (xoff, yoff)) - self.push(ground) - - def do_resize(self): - """usage: resize - - Resize the top image. - """ - ysize = int(self.do_pop()) - xsize = int(self.do_pop()) - image = self.do_pop() - self.push(image.resize((xsize, ysize))) - - def do_rotate(self): - """usage: rotate - - Rotate image through a given angle - """ - angle = int(self.do_pop()) - image = self.do_pop() - self.push(image.rotate(angle)) - - def do_save(self): - """usage: save - - Save image with default options. - """ - filename = self.do_pop() - image = self.do_pop() - image.save(filename) - - def do_save2(self): - """usage: save2 - - Save image with specified options. - """ - filename = self.do_pop() - options = self.do_pop() - image = self.do_pop() - image.save(filename, None, options) - - def do_show(self): - """usage: show - - Display and pop the top image. - """ - self.do_pop().show() - - def do_thumbnail(self): - """usage: thumbnail - - Modify the top image in the stack to contain a thumbnail of itself. - """ - ysize = int(self.do_pop()) - xsize = int(self.do_pop()) - self.top().thumbnail((xsize, ysize)) - - def do_transpose(self): - """usage: transpose - - Transpose the top image. - """ - transpose = self.do_pop().upper() - image = self.do_pop() - self.push(image.transpose(transpose)) - - # Image attributes - - def do_format(self): - """usage: format - - Push the format of the top image onto the stack. - """ - self.push(self.do_pop().format) - - def do_mode(self): - """usage: mode - - Push the mode of the top image onto the stack. - """ - self.push(self.do_pop().mode) - - def do_size(self): - """usage: size - - Push the image size on the stack as (y, x). - """ - size = self.do_pop().size - self.push(size[0]) - self.push(size[1]) - - # ImageChops operations - - def do_invert(self): - """usage: invert - - Invert the top image. - """ - from PIL import ImageChops - self.push(ImageChops.invert(self.do_pop())) - - def do_lighter(self): - """usage: lighter - - Pop the two top images, push an image of the lighter pixels of both. - """ - from PIL import ImageChops - image1 = self.do_pop() - image2 = self.do_pop() - self.push(ImageChops.lighter(image1, image2)) - - def do_darker(self): - """usage: darker - - Pop the two top images, push an image of the darker pixels of both. - """ - from PIL import ImageChops - image1 = self.do_pop() - image2 = self.do_pop() - self.push(ImageChops.darker(image1, image2)) - - def do_difference(self): - """usage: difference - - Pop the two top images, push the difference image - """ - from PIL import ImageChops - image1 = self.do_pop() - image2 = self.do_pop() - self.push(ImageChops.difference(image1, image2)) - - def do_multiply(self): - """usage: multiply - - Pop the two top images, push the multiplication image. - """ - from PIL import ImageChops - image1 = self.do_pop() - image2 = self.do_pop() - self.push(ImageChops.multiply(image1, image2)) - - def do_screen(self): - """usage: screen - - Pop the two top images, superimpose their inverted versions. - """ - from PIL import ImageChops - image2 = self.do_pop() - image1 = self.do_pop() - self.push(ImageChops.screen(image1, image2)) - - def do_add(self): - """usage: add - - Pop the two top images, produce the scaled sum with offset. - """ - from PIL import ImageChops - image1 = self.do_pop() - image2 = self.do_pop() - scale = float(self.do_pop()) - offset = int(self.do_pop()) - self.push(ImageChops.add(image1, image2, scale, offset)) - - def do_subtract(self): - """usage: subtract - - Pop the two top images, produce the scaled difference with offset. - """ - from PIL import ImageChops - image1 = self.do_pop() - image2 = self.do_pop() - scale = float(self.do_pop()) - offset = int(self.do_pop()) - self.push(ImageChops.subtract(image1, image2, scale, offset)) - - # ImageEnhance classes - - def do_color(self): - """usage: color - - Enhance color in the top image. - """ - from PIL import ImageEnhance - factor = float(self.do_pop()) - image = self.do_pop() - enhancer = ImageEnhance.Color(image) - self.push(enhancer.enhance(factor)) - - def do_contrast(self): - """usage: contrast - - Enhance contrast in the top image. - """ - from PIL import ImageEnhance - factor = float(self.do_pop()) - image = self.do_pop() - enhancer = ImageEnhance.Contrast(image) - self.push(enhancer.enhance(factor)) - - def do_brightness(self): - """usage: brightness - - Enhance brightness in the top image. - """ - from PIL import ImageEnhance - factor = float(self.do_pop()) - image = self.do_pop() - enhancer = ImageEnhance.Brightness(image) - self.push(enhancer.enhance(factor)) - - def do_sharpness(self): - """usage: sharpness - - Enhance sharpness in the top image. - """ - from PIL import ImageEnhance - factor = float(self.do_pop()) - image = self.do_pop() - enhancer = ImageEnhance.Sharpness(image) - self.push(enhancer.enhance(factor)) - - # The interpreter loop - - def execute(self, list): - "Interpret a list of PILDriver commands." - list.reverse() - while len(list) > 0: - self.push(list[0]) - list = list[1:] - if self.verbose: - print("Stack: " + repr(self.stack)) - top = self.top() - if not isinstance(top, str): - continue - funcname = "do_" + top - if not hasattr(self, funcname): - continue - else: - self.do_pop() - func = getattr(self, funcname) - func() - -if __name__ == '__main__': - import sys - - # If we see command-line arguments, interpret them as a stack state - # and execute. Otherwise go interactive. - - driver = PILDriver() - if len(sys.argv[1:]) > 0: - driver.execute(sys.argv[1:]) - else: - print("PILDriver says hello.") - while True: - try: - if sys.version_info[0] >= 3: - line = input('pildriver> ') - else: - line = raw_input('pildriver> ') - except EOFError: - print("\nPILDriver says goodbye.") - break - driver.execute(line.split()) - print(driver.stack) - -# The following sets edit modes for GNU EMACS -# Local Variables: -# mode:python -# End: diff --git a/Scripts/pilfile.py b/Scripts/pilfile.py deleted file mode 100755 index dab240e2f..000000000 --- a/Scripts/pilfile.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library. -# $Id$ -# -# a utility to identify image files -# -# this script identifies image files, extracting size and -# pixel mode information for known file formats. Note that -# you don't need the PIL C extension to use this module. -# -# History: -# 0.0 1995-09-01 fl Created -# 0.1 1996-05-18 fl Modified options, added debugging mode -# 0.2 1996-12-29 fl Added verify mode -# 0.3 1999-06-05 fl Don't mess up on class exceptions (1.5.2 and later) -# 0.4 2003-09-30 fl Expand wildcards on Windows; robustness tweaks -# - -from __future__ import print_function - -import getopt -import glob -import logging -import sys - -from PIL import Image - -if len(sys.argv) == 1: - print("PIL File 0.4/2003-09-30 -- identify image files") - print("Usage: pilfile [option] files...") - print("Options:") - print(" -f list supported file formats") - print(" -i show associated info and tile data") - print(" -v verify file headers") - print(" -q quiet, don't warn for unidentified/missing/broken files") - sys.exit(1) - -try: - opt, args = getopt.getopt(sys.argv[1:], "fqivD") -except getopt.error as v: - print(v) - sys.exit(1) - -verbose = quiet = verify = 0 -logging_level = "WARNING" - -for o, a in opt: - if o == "-f": - Image.init() - id = sorted(Image.ID) - print("Supported formats:") - for i in id: - print(i, end=' ') - sys.exit(1) - elif o == "-i": - verbose = 1 - elif o == "-q": - quiet = 1 - elif o == "-v": - verify = 1 - elif o == "-D": - logging_level = "DEBUG" - -logging.basicConfig(level=logging_level) - - -def globfix(files): - # expand wildcards where necessary - if sys.platform == "win32": - out = [] - for file in files: - if glob.has_magic(file): - out.extend(glob.glob(file)) - else: - out.append(file) - return out - return files - -for file in globfix(args): - try: - im = Image.open(file) - print("%s:" % file, im.format, "%dx%d" % im.size, im.mode, end=' ') - if verbose: - print(im.info, im.tile, end=' ') - print() - if verify: - try: - im.verify() - except: - if not quiet: - print("failed to verify image", end=' ') - print("(%s:%s)" % (sys.exc_info()[0], sys.exc_info()[1])) - except IOError as v: - if not quiet: - print(file, "failed:", v) - except: - import traceback - if not quiet: - print(file, "failed:", "unexpected error") - traceback.print_exc(file=sys.stdout) diff --git a/Scripts/pilfont.py b/Scripts/pilfont.py deleted file mode 100755 index aa6a34083..000000000 --- a/Scripts/pilfont.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# -# PIL raster font compiler -# -# history: -# 1997-08-25 fl created -# 2002-03-10 fl use "from PIL import" -# - -from __future__ import print_function - -import glob -import sys - -# drivers -from PIL import BdfFontFile -from PIL import PcfFontFile - -VERSION = "0.4" - -if len(sys.argv) <= 1: - print("PILFONT", VERSION, "-- PIL font compiler.") - print() - print("Usage: pilfont fontfiles...") - print() - print("Convert given font files to the PIL raster font format.") - print("This version of pilfont supports X BDF and PCF fonts.") - sys.exit(1) - -files = [] -for f in sys.argv[1:]: - files = files + glob.glob(f) - -for f in files: - - print(f + "...", end=' ') - - try: - - fp = open(f, "rb") - - try: - p = PcfFontFile.PcfFontFile(fp) - except SyntaxError: - fp.seek(0) - p = BdfFontFile.BdfFontFile(fp) - - p.save(f) - - except (SyntaxError, IOError): - print("failed") - - else: - print("OK") diff --git a/Scripts/pilprint.py b/Scripts/pilprint.py deleted file mode 100755 index 3d8d01751..000000000 --- a/Scripts/pilprint.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library. -# $Id$ -# -# print image files to postscript printer -# -# History: -# 0.1 1996-04-20 fl Created -# 0.2 1996-10-04 fl Use draft mode when converting. -# 0.3 2003-05-06 fl Fixed a typo or two. -# - -from __future__ import print_function -import getopt -import os -import sys -import subprocess - -VERSION = "pilprint 0.3/2003-05-05" - -from PIL import Image -from PIL import PSDraw - -letter = (1.0*72, 1.0*72, 7.5*72, 10.0*72) - - -def description(filepath, image): - title = os.path.splitext(os.path.split(filepath)[1])[0] - format = " (%dx%d " - if image.format: - format = " (" + image.format + " %dx%d " - return title + format % image.size + image.mode + ")" - -if len(sys.argv) == 1: - print("PIL Print 0.3/2003-05-05 -- print image files") - print("Usage: pilprint files...") - print("Options:") - print(" -c colour printer (default is monochrome)") - print(" -d debug (show available drivers)") - print(" -p print via lpr (default is stdout)") - print(" -P same as -p but use given printer") - sys.exit(1) - -try: - opt, argv = getopt.getopt(sys.argv[1:], "cdpP:") -except getopt.error as v: - print(v) - sys.exit(1) - -printerArgs = [] # print to stdout -monochrome = 1 # reduce file size for most common case - -for o, a in opt: - if o == "-d": - # debug: show available drivers - Image.init() - print(Image.ID) - sys.exit(1) - elif o == "-c": - # colour printer - monochrome = 0 - elif o == "-p": - # default printer channel - printerArgs = ["lpr"] - elif o == "-P": - # printer channel - printerArgs = ["lpr", "-P%s" % a] - -for filepath in argv: - try: - - im = Image.open(filepath) - - title = description(filepath, im) - - if monochrome and im.mode not in ["1", "L"]: - im.draft("L", im.size) - im = im.convert("L") - - if printerArgs: - p = subprocess.Popen(printerArgs, stdin=subprocess.PIPE) - fp = p.stdin - else: - fp = sys.stdout - - ps = PSDraw.PSDraw(fp) - - ps.begin_document() - ps.setfont("Helvetica-Narrow-Bold", 18) - ps.text((letter[0], letter[3]+24), title) - ps.setfont("Helvetica-Narrow-Bold", 8) - ps.text((letter[0], letter[1]-30), VERSION) - ps.image(letter, im) - ps.end_document() - - if printerArgs: - fp.close() - - except: - print("cannot print image", end=' ') - print("(%s:%s)" % (sys.exc_info()[0], sys.exc_info()[1])) diff --git a/Scripts/player.py b/Scripts/player.py deleted file mode 100755 index 6e6e21d20..000000000 --- a/Scripts/player.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# - -from __future__ import print_function - -import sys - -if sys.version_info[0] > 2: - import tkinter -else: - import Tkinter as tkinter - -from PIL import Image, ImageTk - - -# -------------------------------------------------------------------- -# an image animation player - -class UI(tkinter.Label): - - def __init__(self, master, im): - self.im = im - if isinstance(self.im, list): - # list of images - im = self.im.pop(0) - - if im.mode == "1": - self.image = ImageTk.BitmapImage(im, foreground="white") - else: - self.image = ImageTk.PhotoImage(im) - - tkinter.Label.__init__(self, master, image=self.image, bg="black", bd=0) - - self.update() - - duration = im.info.get("duration", 100) - self.after(duration, self.next) - - def next(self): - - if isinstance(self.im, list): - - try: - im = self.im[0] - del self.im[0] - self.image.paste(im) - except IndexError: - return # end of list - - else: - - try: - im = self.im - im.seek(im.tell() + 1) - self.image.paste(im) - except EOFError: - return # end of file - - duration = im.info.get("duration", 100) - self.after(duration, self.next) - - self.update_idletasks() - - -# -------------------------------------------------------------------- -# script interface - -if __name__ == "__main__": - - if not sys.argv[1:]: - print("Syntax: python player.py imagefile(s)") - sys.exit(1) - - filename = sys.argv[1] - - root = tkinter.Tk() - root.title(filename) - - if len(sys.argv) > 2: - # list of images - print("loading...") - im = [] - for filename in sys.argv[1:]: - im.append(Image.open(filename)) - else: - # sequence - im = Image.open(filename) - - UI(root, im).pack() - - root.mainloop() diff --git a/Scripts/thresholder.py b/Scripts/thresholder.py deleted file mode 100755 index c6c62ff19..000000000 --- a/Scripts/thresholder.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# -# this demo script illustrates how a 1-bit BitmapImage can be used -# as a dynamically updated overlay -# - -import sys - -if sys.version_info[0] > 2: - import tkinter -else: - import Tkinter as tkinter - -from PIL import Image, ImageTk - -# -# an image viewer - - -class UI(tkinter.Frame): - def __init__(self, master, im, value=128): - tkinter.Frame.__init__(self, master) - - self.image = im - self.value = value - - self.canvas = tkinter.Canvas(self, width=im.size[0], height=im.size[1]) - self.backdrop = ImageTk.PhotoImage(im) - self.canvas.create_image(0, 0, image=self.backdrop, anchor=tkinter.NW) - self.canvas.pack() - - scale = tkinter.Scale(self, orient=tkinter.HORIZONTAL, from_=0, to=255, - resolution=1, command=self.update_scale, - length=256) - scale.set(value) - scale.bind("", self.redraw) - scale.pack() - - # uncomment the following line for instant feedback (might - # be too slow on some platforms) - # self.redraw() - - def update_scale(self, value): - self.value = float(value) - - self.redraw() - - def redraw(self, event=None): - - # create overlay (note the explicit conversion to mode "1") - im = self.image.point(lambda v, t=self.value: v >= t, "1") - self.overlay = ImageTk.BitmapImage(im, foreground="green") - - # update canvas - self.canvas.delete("overlay") - self.canvas.create_image(0, 0, image=self.overlay, anchor=tkinter.NW, - tags="overlay") - -# -------------------------------------------------------------------- -# main - -if len(sys.argv) != 2: - print("Usage: thresholder file") - sys.exit(1) - -root = tkinter.Tk() - -im = Image.open(sys.argv[1]) - -if im.mode != "L": - im = im.convert("L") - -# im.thumbnail((320,200)) - -UI(root, im).pack() - -root.mainloop() diff --git a/Scripts/viewer.py b/Scripts/viewer.py deleted file mode 100755 index c5b0b55ca..000000000 --- a/Scripts/viewer.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -# The Python Imaging Library -# $Id$ -# - -from __future__ import print_function - -import sys - -if sys.version_info[0] > 2: - import tkinter -else: - import Tkinter as tkinter - -from PIL import Image, ImageTk - -# -# an image viewer - - -class UI(tkinter.Label): - - def __init__(self, master, im): - - if im.mode == "1": - # bitmap image - self.image = ImageTk.BitmapImage(im, foreground="white") - tkinter.Label.__init__(self, master, image=self.image, bd=0, - bg="black") - - else: - # photo image - self.image = ImageTk.PhotoImage(im) - tkinter.Label.__init__(self, master, image=self.image, bd=0) - -# -# script interface - -if __name__ == "__main__": - - if not sys.argv[1:]: - print("Syntax: python viewer.py imagefile") - sys.exit(1) - - filename = sys.argv[1] - - root = tkinter.Tk() - root.title(filename) - - im = Image.open(filename) - - UI(root, im).pack() - - root.mainloop() diff --git a/setup.py b/setup.py index 202266139..02f72d99b 100755 --- a/setup.py +++ b/setup.py @@ -9,7 +9,6 @@ # ------------------------------ from __future__ import print_function -import glob import os import platform as plat import re @@ -796,7 +795,6 @@ try: ext_modules=[Extension("PIL._imaging", ["_imaging.c"])], include_package_data=True, packages=find_packages(), - scripts=glob.glob("Scripts/*.py"), test_suite='nose.collector', keywords=["Imaging", ], license='Standard PIL License',