From 8d4487bb4d41cb379658f32908722be15fb3d7db Mon Sep 17 00:00:00 2001 From: Zhang Muyu Date: Fri, 13 Oct 2023 21:40:16 +0800 Subject: [PATCH] update: sources. --- example/sa_pa_distance.json | 20 +++++++ main/sa_pa_distance.py | 116 ++++++++++++++++++++++++++++++++++++ resources/7.png | Bin 0 -> 12659 bytes 3 files changed, 136 insertions(+) create mode 100644 example/sa_pa_distance.json create mode 100644 main/sa_pa_distance.py create mode 100644 resources/7.png diff --git a/example/sa_pa_distance.json b/example/sa_pa_distance.json new file mode 100644 index 0000000..443ecb5 --- /dev/null +++ b/example/sa_pa_distance.json @@ -0,0 +1,20 @@ +{ + "icons": [1, 5], + "lines": [ + { + "type": 7, + "info": { + "name": "响沙湾服务区" + }, + "distance": "32" + }, + { + "type": 8, + "info": { + "text": "成陵服务区", + "en": "Mausoleum of Genghis Khan" + }, + "distance": "128" + } + ] +} \ No newline at end of file diff --git a/main/sa_pa_distance.py b/main/sa_pa_distance.py new file mode 100644 index 0000000..298f287 --- /dev/null +++ b/main/sa_pa_distance.py @@ -0,0 +1,116 @@ +import os +import sys +import time +import argparse +sys.path.append(os.getcwd()) + +import svgwrite +import json +from PIL import Image + +from utils.font_size import * +from utils.image import * +from utils.platform import * +from utils.io import * +from components.text import * +from components.rect import * +from components.factory import * +from settings import * + +assert is_windows() or is_darwin() + +safe_area_size = 20 * SCALE +min_horizontal_space = 50 * SCALE +vertical_space = 20 * SCALE +text_size = 40 * SCALE +icon_height = 100 * SCALE +min_width = 300 * SCALE + +parser = argparse.ArgumentParser() +parser.add_argument('-d', '--data', dest='Data', type=str, default='./example/sa_pa_distance.json', help='Path of json data file.') +args = parser.parse_args() +data_file_path = args.Data + +data_file_name = 'sa_pa_distance_{}'.format(time.strftime('%Y%m%d%H%M%S')) +svg_file_path = './output/{}.svg'.format(data_file_name) +png_file_path = './output/{}.png'.format(data_file_name) +# load data +with open(data_file_path, 'r', encoding='utf8') as file: + data = json.load(file) + +icons = data.get('icons') +icon_imgs = [] +for icon in icons: + icon_file_path = './resources/{}.png'.format(icon) + icon_img = Image.open(icon_file_path) + icon_img = icon_img.resize((int(icon_height * (icon_img.width / icon_img.height)), int(icon_height))) + icon_imgs.append(icon_img) + +line_heights = [] +loc_lines = [] +dis_lines = [] + +content_width = min_width +lines = data.get('lines') +for line in lines: + dis_ele = TextAComponent(line.get('distance'), COLOR_WHITE, text_size) + item_type = line.get('type') + item_info = line.get('info') + + factory = ComponentFactory(text_size, COLOR_WHITE) + ele = factory.component(item_type, item_info) + + loc_lines.append(ele) + dis_lines.append(dis_ele) + line_heights.append(max(ele.height(), dis_ele.height())) + content_width = max(content_width, ele.width() + min_horizontal_space + dis_ele.width() + 2 * safe_area_size, min_width, max(sum([img.width for img in icon_imgs]), ele.width() + text_size) + 2 * safe_area_size) + +content_height = icon_height + sum(line_heights) + (len(line_heights) - 1) * vertical_space + 2 * safe_area_size + +dwg = svgwrite.Drawing(svg_file_path, profile='tiny', width=content_width, height=content_height) + +bg_rect = DoubleStrokeRectComponent(width=content_width, height=content_height, main_color=COLOR_GREEN, stroke_color=COLOR_WHITE, stroke_width=4 * SCALE, r=16 * SCALE) +bg_rect.draw(dwg, 0, 0) +dwg.add(dwg.rect( + insert=(4 * SCALE, 4 * SCALE), + size=(content_width - 2 * 4 * SCALE, icon_height + 4 * SCALE), + rx=16 * SCALE - 4 * SCALE, + ry=16 * SCALE - 4 * SCALE, + fill=COLOR_WHITE +)) +dwg.add(dwg.rect( + insert=(4 * SCALE, 4 * SCALE + icon_height + 4 * SCALE - (16 * SCALE - 4 * SCALE)), + size=(content_width - 2 * 4 * SCALE, 16 * SCALE - 4 * SCALE), + rx=0, + ry=0, + fill=COLOR_WHITE +)) + +current_line_y = safe_area_size + icon_height +for (loc, dis, height) in zip(loc_lines, dis_lines, line_heights): + unit_ele = TextAComponent('km', COLOR_WHITE, text_size * 0.6) + + loc_x = safe_area_size + loc_y = current_line_y + (height - loc.height()) / 2 + + unit_x = content_width - safe_area_size - unit_ele.width() + dis_x = unit_x - dis.width() + dis_y = current_line_y + (height - dis.height()) / 2 + unit_y = dis_y + (dis.height() - unit_ele.height()) * 0.8 + + loc.draw(dwg, loc_x, loc_y) + dis.draw(dwg, dis_x, dis_y) + unit_ele.draw(dwg, unit_x, unit_y) + + current_line_y += (height + vertical_space) + +svg2png(dwg, content_width, content_height, svg_file_path, png_file_path) + +dst = Image.open(png_file_path) +icon_y = int(2 * 4 * SCALE) +icon_x = int((content_width - sum([img.width for img in icon_imgs])) / 2) +for icon_img in icon_imgs: + dst.paste(icon_img, (icon_x, icon_y), icon_img) + icon_x += icon_img.width + +save_image(dst, png_file_path) \ No newline at end of file diff --git a/resources/7.png b/resources/7.png new file mode 100644 index 0000000000000000000000000000000000000000..95f70b82529347dc5acd2974a00137f28c6d7ec4 GIT binary patch literal 12659 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 literal 0 HcmV?d00001