Spaces:
Running
Running
# -*- coding: utf-8 -*- | |
# Copyright (c) XiMing Xing. All rights reserved. | |
# Author: XiMing Xing | |
# Description: | |
import xml.etree.ElementTree as ET | |
import statistics | |
import argparse | |
def paths_pruning(svg_file_path, output_file_path, opacity_delta=0.2): | |
try: | |
# Parse the SVG file | |
tree = ET.parse(svg_file_path) | |
namespace = "http://www.w3.org/2000/svg" | |
ET.register_namespace("", namespace) | |
root = tree.getroot() | |
root.set('version', '1.1') | |
paths = root.findall('.//{http://www.w3.org/2000/svg}path') | |
# Collect stroke-opacity attribute values | |
opacity_values = [] | |
for path in paths: | |
opacity = path.get("stroke-opacity") | |
if opacity is not None: | |
opacity_values.append(float(opacity)) | |
# Calculate median opacity | |
median_opacity = statistics.median(opacity_values) + opacity_delta | |
# Create a temporary list to store paths to be removed | |
paths_to_remove = [] | |
for path in paths: | |
opacity = path.get('stroke-opacity') | |
if opacity is not None and float(opacity) < median_opacity: | |
paths_to_remove.append(path) | |
# Remove paths from the root element | |
for path in paths_to_remove: | |
path.set('stroke-opacity', '0') | |
print(f"n_path: {len(paths)}, " | |
f"opacity_thresh: {median_opacity}, " | |
f"n_path_to_remove: {len(set(paths_to_remove))}.") | |
# Save the modified SVG to the specified path | |
tree.write(output_file_path, encoding='utf-8', xml_declaration=True, default_namespace="") | |
# print("SVG file saved successfully.") | |
# print(f"file has been saved in: {output_file_path}") | |
except Exception as e: | |
print(f"An error occurred: {str(e)}") | |
if __name__ == '__main__': | |
""" | |
python process_svg.py -save ./xx.svg -tar ./xx.svg | |
""" | |
parser = argparse.ArgumentParser() | |
parser.add_argument("-tar", "--target_file", | |
default="", type=str, | |
help="the path of SVG file place.") | |
parser.add_argument("-save", "--save_path", | |
default="", type=str, | |
help="the path of processed SVG file place.") | |
parser.add_argument("-od", "--opacity_delta", | |
default=0.1, type=float) | |
args = parser.parse_args() | |
paths_pruning(args.target_file, args.save_path, float(args.opacity_delta)) | |