From 17e6219140e6eee7c01cf96b2544151800b4ccdb Mon Sep 17 00:00:00 2001 From: Piotr Oleszczyk Date: Wed, 18 Jun 2025 15:12:57 +0200 Subject: [PATCH] fix composition --- app.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index d0ffcc3..8fc242e 100644 --- a/app.py +++ b/app.py @@ -32,7 +32,7 @@ def make_code128(data: str) -> Image.Image: "module_width": 0.5, # bar thickness "quiet_zone": 1.0, # margin on each side "font_size": 10, # text size - "text_distance": 1.0, # gap between bars and text + "text_distance": 5.0, # gap between bars and text # you can also pass 'format': 'PNG' here if needed }, text=data, # explicitly draw your data string under the bars @@ -59,15 +59,36 @@ class PrintRequest(BaseModel): def compose_label(images: List[Image.Image]) -> Image.Image: + """ + Horizontally stack each barcode image with padding, + first scaling them all to the same height. + """ border, spacing = 10, 20 - framed = [ImageOps.expand(img, border=border, fill="white") for img in images] - max_h = max(img.height for img in framed) - total_w = sum(img.width for img in framed) + spacing * (len(framed) - 1) - canvas = Image.new("1", (total_w, max_h), 1) + # 1) Determine target inner height (max of original heights) + inner_h = max(img.height for img in images) + + # 2) Scale each image to inner_h, then frame it + framed = [] + for img in images: + w, h = img.size + new_w = int(w * inner_h / h) + # high-quality up-scaling + img_scaled = img.resize((new_w, inner_h), Image.LANCZOS) + # add white border + framed_img = ImageOps.expand(img_scaled, border=border, fill="white") + framed.append(framed_img) + + # 3) Compute final canvas size + total_w = sum(img.width for img in framed) + spacing * (len(framed) - 1) + final_h = inner_h + 2 * border + + # 4) Create canvas and paste each framed image + canvas = Image.new("1", (total_w, final_h), 1) x = 0 for img in framed: - y = (max_h - img.height) // 2 + # vertical center (though they’re all same height now) + y = (final_h - img.height) // 2 canvas.paste(img, (x, y)) x += img.width + spacing