From 860d892eba92a0970e1c26eec71746650aecb75a Mon Sep 17 00:00:00 2001 From: big-nacho Date: Thu, 19 Jun 2025 16:09:10 +0000 Subject: [PATCH] Fix transparency CU-86c42m6a9 --- vectorizing/solvers/color/ColorSolver.py | 2 +- vectorizing/solvers/color/clip.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/vectorizing/solvers/color/ColorSolver.py b/vectorizing/solvers/color/ColorSolver.py index cd79830..ba7c748 100644 --- a/vectorizing/solvers/color/ColorSolver.py +++ b/vectorizing/solvers/color/ColorSolver.py @@ -35,7 +35,7 @@ def solve(self): self.timer.end_timer() self.timer.start_timer("Polygon Clipping") - compound_paths = remove_layering(traced_bitmaps, self.img) + compound_paths = remove_layering(traced_bitmaps, self.img, has_background) self.timer.end_timer() return [compound_paths, colors, self.img.size[0], self.img.size[1]] diff --git a/vectorizing/solvers/color/clip.py b/vectorizing/solvers/color/clip.py index e563e2e..7f34427 100644 --- a/vectorizing/solvers/color/clip.py +++ b/vectorizing/solvers/color/clip.py @@ -20,7 +20,7 @@ def create_background_rect(img, padding): rect.close() return rect -def remove_layering(traced_bitmaps, img): +def remove_layering(traced_bitmaps, img, has_background): """ Performs boolean operations on a list of traced bitmaps to ensure that they are all disjoint. @@ -35,6 +35,7 @@ def remove_layering(traced_bitmaps, img): Parameters: traced_bitmaps: The list of traced bitmaps (potrace paths). img: A Pillow image. + has_background: Whether the image has a transparent background Returns: The processed list of compound paths. @@ -43,6 +44,19 @@ def remove_layering(traced_bitmaps, img): potrace_path_to_compound_path(traced) for traced in traced_bitmaps ] + if has_background: + # If there's a transparent background, the boolean trick + # can't be used because the top path (the one who contains all + # the subsequent ones before they are separated) does not cover + # the total area of the image + for x in range(len(compound_paths) - 1): + next = compound_paths[x + 1] + try: + compound_paths[x] = op(compound_paths[x], next, PathOp.DIFFERENCE) + except: + break + return compound_paths + disjoint_paths = [] for x in range(len(compound_paths) - 1): # Each base path has bigger padding to reduce