Implement function halo().
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 21:46:27 +0000 (23:46 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 21:46:27 +0000 (23:46 +0200)
gimp_passport.py
test_gimp_passport.py

index 3c13fd6..acbce85 100644 (file)
@@ -110,6 +110,22 @@ def cut_lines_xy(img: Image, columns: int, rows: int, tile_size: Tuple[int, int]
     cut_lines(img, rows, tile_size[1], margin, spacing, 0)
 
 
+def halo(paper: Image, columns: int, rows: int, tile_size: Tuple[int, int], halo: int, margin: int, spacing: int):
+    """Creates a tiled "halos" around the yet-to-be-drawn passport tiles to that cut lines don't touch them.
+
+    :param paper: image that should be modified.
+    :param columns: number of tiles in horizontal direction.
+    :param rows: number of tiles in vertical direction.
+    :param tile_size: the (width, height) tuple of the tile without halo
+    :param halo: additional white pixels around the tiles in each direction.
+    :param margin: space between paper border and first tile in pixel.
+    :param spacing: space between tiles in pixel.
+    """
+    halo_tile_size = tuple(size + 2 * halo for size in tile_size)
+    halo_tile = Image.new('RGB', halo_tile_size, 'white')
+    tile(paper, halo_tile, columns, rows, margin - halo, spacing - 2 * halo)
+
+
 def tile(paper: Image, tile: Image, columns: int, rows: int, margin: int, spacing: int):
     """On the given "paper" create a grid of a tile with the given number of columns and rows.
 
index 6e73a51..31a05b8 100644 (file)
@@ -1,7 +1,7 @@
 import os
 import unittest
 from PIL import Image, ImageDraw
-from gimp_passport import mm_to_pixel, num_tiles, tile_edge, line, cut_lines, cut_lines_xy,  make_passport, tile, \
+from gimp_passport import mm_to_pixel, num_tiles, tile_edge, line, cut_lines, cut_lines_xy,  make_passport, halo, tile, \
     downsample_large, main
 
 
@@ -52,6 +52,10 @@ class TestMakePassport(unittest.TestCase):
         img = Image.new('RGB', (100, 60))
         cut_lines_xy(img, 4, 3, (20, 9), 5, 2)
 
+    def test_halo(self):
+        img = Image.new('RGB', (100, 60))
+        halo(img, 4, 3, (20, 9), 1, 5, 2)
+
     def test_tile(self):
         dpi = 90
         passport_tile = Image.new('RGB', (mm_to_pixel(35, dpi), mm_to_pixel(45, dpi)), 'lightgray')