如何去除填色数字SVG文件中的颜色值?
解决SVG数字填色转涂色本样式的问题
几年前制作的数字填色(paint by number)SVG文件,原开源项目已丢失,找回后想要将其修改为仅保留白色背景、黑色线条和数字标签的涂色本样式。尝试用简单Python代码删除fill和stroke属性,但效果不佳,方法过于简单低效。
原尝试代码
import xml.etree.ElementTree as ET svg_file = ET.parse('test1.svg') root = svg_file.getroot() for elem in root.iter(): if 'fill' in elem.attrib: del elem.attrib['fill'] if 'stroke' in elem.attrib: del elem.attrib['stroke'] svg_file.write('test1_1.svg')
改进后的Python处理方案
仅删除属性会让SVG使用渲染工具的默认样式,可能导致填充色残留、线条不可见等问题。我们需要主动指定样式,确保效果符合预期:
import xml.etree.ElementTree as ET from xml.etree.ElementTree import Element # 注册SVG命名空间,防止解析时标签异常 ET.register_namespace('', "http://www.w3.org/2000/svg") def convert_to_coloring_book(input_svg, output_svg): tree = ET.parse(input_svg) root = tree.getroot() # 获取SVG画布尺寸,用于生成背景 svg_width = root.attrib.get('width', '100%') svg_height = root.attrib.get('height', '100%') # 添加白色背景矩形,放在最底层 bg_rect = Element('rect') bg_rect.attrib.update({ 'width': svg_width, 'height': svg_height, 'fill': 'white' }) root.insert(0, bg_rect) # 遍历所有元素,分类型设置样式 for elem in root.iter(): # 处理命名空间,提取标签名 tag_name = elem.tag.split('}')[-1] # 图形元素:黑色描边,无填充 if tag_name in ['rect', 'circle', 'ellipse', 'polygon', 'polyline', 'path', 'line']: elem.attrib['stroke'] = 'black' # 保留原有线条宽度,默认设为1px elem.attrib['stroke-width'] = elem.attrib.get('stroke-width', '1') elem.attrib['fill'] = 'none' # 文本元素(数字标签):黑色填充,确保清晰可见 elif tag_name == 'text': elem.attrib['fill'] = 'black' # 可选:若文本有描边,也设为黑色避免模糊 if 'stroke' in elem.attrib: elem.attrib['stroke'] = 'black' elem.attrib['stroke-width'] = '0.3' # 写入文件,指定UTF-8编码避免乱码 tree.write(output_svg, encoding='utf-8', xml_declaration=True) # 调用示例 convert_to_coloring_book('test1.svg', 'test1_coloring_book.svg')
核心优化点
- 命名空间兼容:SVG文件通常带命名空间,注册后避免解析时标签丢失或变形
- 主动设置样式:不依赖默认值,明确给图形元素设
fill="none"和stroke="black",确保线条和空白区域符合要求 - 背景兜底:主动添加白色背景矩形,避免透明底色导致的显示问题
- 文本单独处理:保留数字标签的黑色填充,防止被误清除
内容的提问来源于stack exchange,提问作者SunnyD
相关产品推荐
相关产品推荐

