summaryrefslogtreecommitdiffstats
path: root/build/pypng/pipwindow
diff options
context:
space:
mode:
Diffstat (limited to 'build/pypng/pipwindow')
-rw-r--r--build/pypng/pipwindow67
1 files changed, 67 insertions, 0 deletions
diff --git a/build/pypng/pipwindow b/build/pypng/pipwindow
new file mode 100644
index 0000000..2f8c7a2
--- /dev/null
+++ b/build/pypng/pipwindow
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+# $URL: http://pypng.googlecode.com/svn/trunk/code/pipwindow $
+# $Rev: 173 $
+
+# pipwindow
+# Tool to crop/expand an image to a rectangular window. Come the
+# revolution this tool will allow the image and the window to be placed
+# arbitrarily (in particular the window can be bigger than the picture
+# and/or overlap it only partially) and the image can be OpenGL style
+# border/repeat effects (repeat, mirrored repeat, clamp, fixed
+# background colour, background colour from source file). For now it
+# only acts as crop. The window must be no greater than the image in
+# both x and y.
+
+def window(tl, br, inp, out):
+ """Place a window onto the image and cut-out the resulting
+ rectangle. The window is an axis aligned rectangle opposite corners
+ at *tl* and *br* (each being an (x,y) pair). *inp* specifies the
+ input file which should be a PNG image.
+ """
+
+ import png
+
+ r = png.Reader(file=inp)
+ x,y,pixels,meta = r.asDirect()
+ if not (0 <= tl[0] < br[0] <= x):
+ raise NotImplementedError()
+ if not (0 <= tl[1] < br[1] <= y):
+ raise NotImplementedError()
+ # Compute left and right bounds for each row
+ l = tl[0] * meta['planes']
+ r = br[0] * meta['planes']
+ def itercrop():
+ """An iterator to perform the crop."""
+
+ for i,row in enumerate(pixels):
+ if i < tl[1]:
+ continue
+ if i >= br[1]:
+ # Same as "raise StopIteration"
+ return
+ yield row[l:r]
+ meta['size'] = (br[0]-tl[0], br[1]-tl[1])
+ w = png.Writer(**meta)
+ w.write(out, itercrop())
+
+def main(argv=None):
+ import sys
+
+ if argv is None:
+ argv = sys.argv
+ argv = argv[1:]
+
+ tl = (0,0)
+ br = tuple(map(int, argv[:2]))
+ if len(argv) >= 4:
+ tl = br
+ br = tuple(map(int, argv[2:4]))
+ if len(argv) in (2, 4):
+ f = sys.stdin
+ else:
+ f = open(argv[-1], 'rb')
+
+ return window(tl, br, f, sys.stdout)
+
+if __name__ == '__main__':
+ main()