[GRASS-SVN] r70732 - grass/trunk/tools

svn_grass at osgeo.org svn_grass at osgeo.org
Sun Mar 5 20:27:28 PST 2017


Author: wenzeslaus
Date: 2017-03-05 20:27:28 -0800 (Sun, 05 Mar 2017)
New Revision: 70732

Added:
   grass/trunk/tools/ppmrotate.py
Log:
separate PPM rotation script, code not needed for thumbnails (follows r70725)

Copied: grass/trunk/tools/ppmrotate.py (from rev 70725, grass/trunk/tools/thumbnails.py)
===================================================================
--- grass/trunk/tools/ppmrotate.py	                        (rev 0)
+++ grass/trunk/tools/ppmrotate.py	2017-03-06 04:27:28 UTC (rev 70732)
@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+#
+# ppmrotate.py: Rotate PPM images
+#
+#  AUTHOR: Glynn Clements (Python version)
+#          Vaclav Petras (separate script)
+#      Earlier Bourne script version by Hamish Bowman,
+#      http://grasswiki.osgeo.org/wiki/Talk:Color_tables
+#
+#   (C) 2009-2017 by the GRASS Development Team
+#       This program is free software under the GNU General Public
+#       License (>=v2). Read the file COPYING that comes with GRASS
+#       for details.
+#
+
+import sys
+import os
+import atexit
+import array
+import grass.script as grass
+
+tmp_img = None
+
+height = None
+width = None
+
+
+def cleanup():
+    if tmp_img:
+        grass.try_remove(tmp_img)
+
+# def rotate(src, dst):
+#     grass.call(["convert", "-rotate", "90", src, dst])
+
+
+def read_ppm(src):
+    global width, height
+
+    fh = open(src, "rb")
+    text = fh.read()
+    fh.close()
+    i = 0
+    j = text.find('\n', i)
+    if text[i:j] != 'P6':
+        raise IOError(text[i:j] + " != P6. Is the file PPM?")
+    i = j + 1
+    j = text.find('\n', i)
+    w, h = text[i:j].split()
+    width = int(w)
+    height = int(h)
+    i = j + 1
+    j = text.find('\n', i)
+    maxval = text[i:j]
+    if int(maxval) != 255:
+        raise IOError("Max value in image != 255")
+    i = j + 1
+    return array.array('B', text[i:])
+
+
+def write_ppm(dst, data):
+    w = height
+    h = width
+    fh = open(dst, "wb")
+    fh.write("P6\n%d %d\n%d\n" % (w, h, 255))
+    data.tofile(fh)
+    fh.close()
+
+
+def rotate_ppm(srcd):
+    dstd = array.array('B', len(srcd) * '\0')
+    for y in xrange(height):
+        for x in xrange(width):
+            for c in xrange(3):
+                old_pos = (y * width + x) * 3 + c
+                new_pos = (x * height + (height - 1 - y)) * 3 + c
+                dstd[new_pos] = srcd[old_pos]
+    return dstd
+
+
+def flip_ppm(srcd):
+    dstd = array.array('B', len(srcd) * '\0')
+    stride = width * 3
+    for y in xrange(height):
+        dy = (height - 1 - y)
+        dstd[dy * stride:(dy + 1) * stride] = srcd[y * stride:(y + 1) * stride]
+    return dstd
+
+
+def ppmtopng(dst, src):
+    if grass.find_program("g.ppmtopng", '--help'):
+        grass.run_command('g.ppmtopng', input=src, output=dst, quiet=True)
+    elif grass.find_program("pnmtopng"):
+        fh = open(dst, 'wb')
+        grass.call(["pnmtopng", src], stdout=fh)
+        fh.close()
+    elif grass.find_program("convert"):
+        grass.call(["convert", src, dst])
+    else:
+        grass.fatal(_("Cannot find g.ppmtopng, pnmtopng or convert"))
+
+
+def convert_and_rotate(src, dst, flip=False):
+    global tmp_img
+
+    ppm = read_ppm(src)
+    if flip:
+        ppm = flip_ppm(ppm)
+    ppm = rotate_ppm(ppm)
+    to_png = False
+    if dst.lower().endswith('.png'):
+        to_png = True
+    if to_png:
+        tmp_img = grass.tempfile() + ".ppm"
+        # TODO: clean up the file
+    else:
+        tmp_img = dst
+    write_ppm(tmp_img, ppm)
+    if to_png:
+        ppmtopng(dst, tmp_img)
+
+
+def main():
+    os.environ['GRASS_OVERWRITE'] = '1'
+
+    infile = sys.argv[1]
+    outfile = sys.argv[2]
+
+    convert_and_rotate(infile, outfile, flip=False)
+
+
+if __name__ == "__main__":
+    atexit.register(cleanup)
+    main()



More information about the grass-commit mailing list