Implement function tile_edge and corresponding test.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 18:22:10 +0000 (20:22 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 18:22:10 +0000 (20:22 +0200)
gimp_passport.py
test_gimp_passport.py

index 8f815ee..b8d77da 100644 (file)
@@ -61,6 +61,21 @@ def num_tiles_xy(paper_size: Tuple[float, float], tile_size: Tuple[float, float]
     return tuple(num_tiles(ps, ts, margin, spacing) for ps, ts in zip(paper_size, tile_size))
 
 
+def tile_edge(index: int, length: int, margin: int, spacing: int) -> int:
+    """Returns the left (or top) pixel position (zero based) of the tile with index i.
+    All length units have to be the same (e.g. millimeter or pixel).
+    This function can be used for horizontal (=left) or vertical (=top) edges.
+    The other edge (right or bottom) can be calculated by adding the length to the result.
+
+    :param index: 0 based tile number (0 is leftmost or topmost)
+    :param length: tile width or height
+    :param margin: space between paper border and first tile
+    :param spacing: space between tiles
+    :return: edge
+    """
+    return margin + index * (length + spacing)
+
+
 def tile_bbox(x: int, y: int, tile_size: Tuple[int, int], margin: int, spacing: int) -> Tuple[int, int, int, int]:
     """Returns the bounding box of the tile with indexes x and y. x=0 is the leftmost tile, y=0 is the topmost tile.
     All length units have to be the same (e.g. millimeter or pixel).
@@ -96,18 +111,17 @@ def line(img: Image, pos: int, axis: int) -> Image:
         draw.line(((pos, 0), (pos, img.height)), fill=color)
 
 
-def make_cut_lines(img: Image, count_x: int, count_y: int, width: int, margin: int, spacing: int, 
-                   margin_mm: float, spacing_mm: float) -> Image:
-    """Create and return image representing paper with specified dimensions and copy the given
-    image as often as possible to the paper.
+def make_cut_lines(img: Image, count_x: int, count_y: int, tile_size: Tuple[int, int], margin: int, spacing: int) -> Image:
+    """Paint cut lines for the specified amount of tiles.
 
-    :param img: source image that should be copied.
-    :param paper_width_mm: width of the image representing the paper
-    :param paper_height_mm: height of the image representing the paper
-    :param margin_mm: Free space from the paper borders to the edges of the tiled images.
-    :param spacing_mm: Additional space between tiled images.
+    :param img: image that should be modified.
+    :param count_x: number of tiles in horizontal direction.
+    :param count_y: number of tiles in vertical direction.
+    :param tile_size: tuple of tile (width, height) in pixel.
+    :param margin: space between paper border and first tile in pixel.
+    :param spacing: space between tiles in pixel.
     """
-    dpi = img.info['dpi'][0]
+
     paper_width_pixel = mm_to_pixel(paper_width_mm, dpi)
     paper_height_pixel = mm_to_pixel(paper_height_mm, dpi)
     margin_pixel = mm_to_pixel(margin_mm, dpi)
index df3a8ee..da2b366 100644 (file)
@@ -1,7 +1,7 @@
 import os
 import unittest
 from PIL import Image, ImageDraw
-from gimp_passport import mm_to_pixel, num_tiles, num_tiles_xy, tile_bbox, line, make_passport, tile, \
+from gimp_passport import mm_to_pixel, num_tiles, num_tiles_xy, tile_edge, tile_bbox, line, make_passport, tile, \
     downsample_large, main
 
 
@@ -37,6 +37,14 @@ class TestMakePassport(unittest.TestCase):
         self.assertEqual((2, 2), num_tiles_xy((45., 10.), (15., 4.), 0., 2.))
         self.assertEqual((2, 1), num_tiles_xy((45., 10.), (15., 5.), 1., 1.))
 
+    def test_tile_edge(self):
+        margin = 4
+        spacing = 3
+        length = 9
+        self.assertEqual(4, tile_edge(0, length, margin, spacing))
+        self.assertEqual(16, tile_edge(1, length, margin, spacing))
+        self.assertEqual(28, tile_edge(2, length, margin, spacing))
+
     def test_tile_bbox(self):
         margin = 4
         spacing = 3