广告位联系
返回顶部
分享到

python利用lxml库剩下操作svg图片

python 来源:互联网 作者:佚名 发布时间:2023-01-25 10:51:05 人浏览
摘要

在大多数场景中,我们都用lxml库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。我们可以使用 lxml 中的 etree 模块来解析 SVG 文件,然后使用 SVG 中的各种元素和属性来进

在大多数场景中,我们都用 lxml 库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。我们可以使用 lxml 中的 etree 模块来解析 SVG 文件,然后使用 SVG 中的各种元素和属性来进行操作。

lxml 操作 svg 图片示例

在本篇博客的入门篇,我们首先使用一下 lxml 库解析 svg 文件,并修改它的颜色。

SVG 图片生成,可以查看 《Python 生成 svg 图片,一篇博客带你掌握 Python 与 svg 之间的操作》 这篇博客。

借用 svgwrite 库,生成一个红色背景的 svg 图片。

1

2

3

4

5

6

7

8

import svgwrite

 

dwg = svgwrite.Drawing('demo.svg', size=(100, 20), profile='tiny')

dwg.add(dwg.rect(insert=(0, 0), size=(100, 20), fill='red'))

phone_number = '橡皮擦'

dwg.add(dwg.text(phone_number, insert=(0, 15), fill='white', font_size=12))

 

dwg.save()

同时查看一下 svg 内容,如下所示。

1

2

3

4

5

6

7

<?xml version="1.0" encoding="utf-8" ?>

<svg baseProfile="tiny" height="20" version="1.2" width="100" xmlns="http://www.w3.org/2000/svg"

     xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink">

    <defs/>

    <rect fill="red" height="20" width="100" x="0" y="0"/>

    <text fill="white" font-size="12" x="0" y="15">橡皮擦</text>

</svg>

我们需要替换的内容是 fill="white" ,将其修改为 fill="#03a9f4"。使用 lxml 读取该文件,进行颜色替换。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

from lxml import etree

 

# 解析SVG文件

svg_file = 'demo.svg'

with open(svg_file, 'rb') as f:

    svg_data = f.read()

    parser = etree.XMLParser(remove_blank_text=True)

    svg_tree = etree.fromstring(svg_data, parser)

 

# 修改颜色

for element in svg_tree.iter():

    if 'fill' in element.attrib:

        # 替换颜色

        element.attrib['fill'] = element.attrib['fill'].replace('white', '#03a9f4')

 

# 保存修改后的SVG文件

with open('modified_demo.svg', 'wb') as f:

    f.write(etree.tostring(svg_tree, pretty_print=True))

此时替换之后,再次查看 svg 图片源码内容,如下所示。

1

2

3

4

5

<svg xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="tiny" height="20" version="1.2" width="100">

  <defs/>

  <rect fill="red" height="20" width="100" x="0" y="0"/>

  <text fill="#03a9f4" font-size="12" x="0" y="15">&#27233;&#30382;&#25830;</text>

</svg>

重点注意 text 元素部分,发现 fill 属性的值已经被修改成最新的颜色了。

lxml 给 svg 图片添加新元素

使用 append() 函数可以给 svg 图片添加新元素,例如下述代码将添加一个矩形到图片中。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from lxml import etree

 

# 解析SVG文件

svg_file = 'demo.svg'

with open(svg_file, 'rb') as f:

    svg_data = f.read()

    parser = etree.XMLParser(remove_blank_text=True)

    svg_tree = etree.fromstring(svg_data, parser)

 

new_element = etree.Element('rect', x='5', y='5', width='50', height='20', style='fill:#03a9f4')

svg_tree.append(new_element)

 

 

 

# 保存修改后的SVG文件

with open('modified_demo.svg', 'wb') as f:

    f.write(etree.tostring(svg_tree, pretty_print=True))

这里矩形的定位并没有精确计算,实现的效果图如下所示。

lxml 删除 svg 图片中的元素

除新增外,还可以对 svg 中元素进行删除操作。示例代码如下所示。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

from lxml import etree

 

# 解析SVG文件

svg_file = 'modified_demo.svg'

with open(svg_file, 'r') as f:

    svg_data = f.read()

    parser = etree.XMLParser(remove_blank_text=True)

    svg_tree = etree.fromstring(svg_data, parser)

 

# 通过 xpath 查找需要删除的元素

elements_to_remove = svg_tree.xpath("//text")

print(elements_to_remove)

for element in elements_to_remove:

    element.getparent().remove(element)

运行代码会发现通过 xpath 无法查找到目标元素 text,这时因为 SVG 文件中含有命名空间,导致 xpath 语法查询不到相应的元素,可以通过为 xpath 语法指定命名空间来解决这个问题。

添加命名空间之后的提取语法如下所示。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

from lxml import etree

 

# 解析SVG文件

svg_file = 'modified_demo.svg'

svg_tree = etree.parse(svg_file)

root = svg_tree.getroot()

 

 

# 获取命名空间

ns = {'svg': root.nsmap[None]}

# 通过 xpath 查找需要删除的元素

elements_to_remove = svg_tree.xpath("//svg:text", namespaces=ns)

 

print(elements_to_remove)

尤其注意 xpath 部分需要使用 //svg:text 进行提取。

如果不提前生命 ns 变量,可以使用下述代码进行指定命名空间。

1

elements_to_remove = svg_tree.xpath("//svg:circle", namespaces={'svg': 'http://www.w3.org/2000/svg'})

有了上述基础之后,完整的 lxml 删除元素代码如下所示。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

from lxml import etree

 

# 解析SVG文件

svg_file = 'modified_demo.svg'

svg_tree = etree.parse(svg_file)

root = svg_tree.getroot()

 

 

# 获取命名空间

ns = {'svg': root.nsmap[None]}

# 通过 xpath 查找需要删除的元素

elements_to_remove = svg_tree.xpath("//svg:text", namespaces=ns)

 

print(elements_to_remove)

for element in elements_to_remove:

    element.getparent().remove(element)

 

# 保存修改后的 SVG 文件

with open('modified_demo1.svg', 'wb') as f:

    f.write(etree.tostring(svg_tree, pretty_print=True))


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/hihell/article/details/128723910
相关文章
  • pygame.sprite的精灵碰撞的介绍

    pygame.sprite的精灵碰撞的介绍
    pygame中的精灵碰撞是可见游戏中用的最基础的东西,这里结合官方文档和小甲鱼的网站上的内容做个小总结,方便日后使用。 pygame.sprite.S
  • python利用lxml库剩下操作svg图片

    python利用lxml库剩下操作svg图片
    在大多数场景中,我们都用lxml库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。我们可以使用 lxml 中的 etree 模块来解析
  • Python学习之configparser模块的使用

    Python学习之configparser模块的使用
    1 configparser安装 1 pip3 install configparser 2 configparser简介 用来读取配置文件的python包; 一般做自动化测试的时候,会使用到这个模块,用来封装
  • 20个解决日常编程问题的Python代码

    20个解决日常编程问题的Python代码
    使用这些有用的 Python 代码片段提升你的编程技能,在本文中,我将分享 20 个 Python 代码片段,以帮助你应对日常编程挑战,你可能已经知道
  • Python实现.gif图片拆分为.png图片的实现

    Python实现.gif图片拆分为.png图片的实现
    实现效果展示: 未转化前的gif图片 经转化后: ---------------------------------------------------------------------------------------图一-------------------------
  • pandas实战:分析三国志人物的实现

    pandas实战:分析三国志人物的实现
    简介 背景 Pandas 是 Python 的一个工具库,用于数据分析。 由 AQR Capital Management 于 2008 年 4 月开发,2009 年开源,最初被作为金融数据分析工具
  • 教你用Python提取PPT中的图片

    教你用Python提取PPT中的图片
    一、前言 今天要带大家实现的是PPT图片的提取。在我们学习工作中,PPT的使用还是非常频繁的,但是自己做PPT是很麻烦的,所以就需要用到
  • Python3微信支付(小程序支付)V3接口的实现
    起因: 因公司项目需要网上充值功能,从而对接微信支付,目前也只对接了微信支付的小程序支付功能,在网上找到的都是对接微信支付
  • YOLOv8训练自己的数据集(详细教程)

    YOLOv8训练自己的数据集(详细教程)
    等了好久终于等到了V8,赶紧测测效果,放张官网的比对图 官网链接 https://github.com/ultralytics/ultralytics 再下载自己所需要的权重 https://githu
  • Pandas读取csv的实现介绍
    对于文件的操作中,读写csv操作是一个比较常见的操作,很多时候可能会选择使用python中的文件读取的方式对csv文件操作,这种方式并没有
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计