Implement function cut_lines and cut_lines_xy.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 19:34:17 +0000 (21:34 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 20:52:51 +0000 (22:52 +0200)
gimp_passport.py

index 2453ffb..ff9a00e 100644 (file)
@@ -111,7 +111,24 @@ def line(img: Image, pos: int, axis: int):
         draw.line(((pos, 0), (pos, img.height)), fill=color)
 
 
-def make_cut_lines(img: Image, count_x: int, count_y: int, tile_size: Tuple[int, int], margin: int, spacing: int) -> Image:
+def cut_lines(img: Image, count: int, length: int, margin: int, spacing: int, axis: int):
+    """Paint cut lines for the specified amount of tiles.
+    The function can either be used for horizontal or vertical lines.
+
+    :param img: image that is modified (in place)
+    :param count: number of tiles
+    :param length: width or height of tile (width, height) in pixel.
+    :param margin: space between paper border and first tile in pixel.
+    :param spacing: space between tiles in pixel.
+    :param axis: 0 means horizontal lines, 1 means vertical lines
+    """
+    for i in range(count):
+        pos = tile_edge(i, length, margin, spacing)
+        line(img, pos, axis)
+        line(img, pos + length, axis)
+
+
+def cut_lines_xy(img: Image, count_x: int, count_y: int, tile_size: Tuple[int, int], margin: int, spacing: int):
     """Paint cut lines for the specified amount of tiles.
 
     :param img: image that should be modified.
@@ -121,27 +138,8 @@ def make_cut_lines(img: Image, count_x: int, count_y: int, tile_size: Tuple[int,
     :param margin: space between paper border and first tile in pixel.
     :param spacing: space between tiles in pixel.
     """
-
-    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)
-    spacing_pixel = mm_to_pixel(spacing_mm, dpi)
-    paper = Image.new('RGB', (paper_width_pixel, paper_height_pixel), 'white')
-    paper.info['dpi'] = (dpi, dpi)
-    top = margin_pixel
-    for iy in count():
-        bottom = top + img.height
-        if bottom > paper_height_pixel - margin_pixel:
-            break
-        left = margin_pixel
-        for ix in count():
-            right = left + img.width
-            if right > paper_width_pixel - margin_pixel:
-                break
-            paper.paste(img, (left, top))
-            left = right + spacing_pixel
-        top = bottom + spacing_pixel
-    return paper
+    cut_lines(img, count_x, tile_size[0], margin, spacing, 1)
+    cut_lines(img, count_y, tile_size[1], margin, spacing, 0)
 
 
 def tile(img: Image, paper_width_mm: float, paper_height_mm: float, margin_mm: float,