当前位置: 首页 > article >正文

【java batik_使用BATIK解析SVG生成PNG图片】

矢量图的介绍及应用场景

矢量图是什么意思?

矢量图,也称为向量图,英文名字是Vector graphics。

矢量图是一种基于矢量的图形,由一系列的线段和曲线组成。由数学公式和算法生成的。这意味着矢量图可以在任何分辨率下清晰地显示,而不会出现模糊或失真的情况。

在这里插入图片描述

矢量图一般应用在哪些领域?

矢量图常用于创建图形、图表、标志和插图等,因为它们可以在任何尺寸下保持清晰度,并且可以轻松地进行编辑和修改,所以应用领域就非常广泛,主要分为五个大的领域,包括1. 计算机图形学、2. 平面设计、3. 印刷和出版、4. 建筑和工程以及5. 动画和游戏动画和游戏等领域。
矢量图有哪些特点?

矢量图的特点用一句话就可以总总结:矢量图一种基于矢量的图形,具有清晰度高、可编辑性强、易于缩放等优点。
矢量图最大的优势是我们在文章开始提到的,由数学公式和算法生成的,缩放和修改,可以在任何分辨率下清晰地显示,而不会出现模糊或失真,依旧有优秀的图像质量,也不会丢失原始图像的任何细节。#探秘硬核知识#
哪些软件可以编辑矢量格式的图片?

Adobe Illustrator它支持多种矢量图形格式,包括.AI、.SVG、.EPS等。
AI矢量软件教程-连续旋转复制-设计技能再升级CorelDraw也是一款优秀的矢量图形编辑软件,包括.CDR、.AI、.EPS等。
Ai转cdr怎么转?用什么格式?Inkscape也是一款开源的矢量图形编辑软件。它支持多种矢量图形格式,包括.SVG、.EPS、.PNG等。

在现代的应用开发中,矢量图形的使用越来越广泛,特别是在Web开发和图像处理领域。Batik库作为一款优雅的SVG图形处理工具,可以帮助我们生成、操作和展示矢量图形。

本文将深入探讨Batik库的基本概念、特点,以及如何在实际应用中使用它进行SVG图形处理。
Batik库简介

Batik是由Apache软件基金会开发的一款Java库,用于处理和渲染SVG(Scalable Vector Graphics)图形。它提供了一组丰富的API和工具,用于创建、修改、呈现和操作SVG图形。
Batik库的特点

完整的SVG支持: Batik库支持SVG的各种规范,包括形状、路径、文本、滤镜、动画等。

高质量渲染: Batik库提供了高质量的SVG渲染引擎,可以在不同设备上保持一致的呈现效果。

可扩展性: Batik库允许开发者自定义SVG解析和呈现的行为,以适应不同需求。

跨平台: Batik库是基于Java开发的,因此可以在各种平台上使用。

Batik库的用法
添加依赖

在Maven项目中,你可以通过添加以下依赖来引入Batik库:

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>batik-all</artifactId>
    <version>1.14</version>
</dependency>

创建SVG图形

import org.apache.batik.dom.*;
import org.w3c.dom.*;
import org.apache.batik.svggen.*;

public class SvgExample {
   

    public static void main(String[] args) throws Exception {
   
        DocumentFactory documentFactory = new SAXDocumentFactory(
            XMLResourceDescriptor.getXMLParserClassName(),
            "org.apache.xerces.parsers.SAXParser");

        DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation();
        String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
        Document document = domImpl.createDocument(svgNS, "svg", null);

        SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
        svgGenerator.draw(new Rectangle(100, 100));
        svgGenerator.stream(System.out, true);
    }
}

Batik库的应用场景

Web图形展示: 可以使用Batik库将SVG图形嵌入到网页中,实现动态图形展示。

图像生成: Batik库可以生成高质量的SVG图像,用于生成报表、图表等。

图像处理: 可以使用Batik库修改SVG图形,添加滤镜、变形等效果。

注意事项

学习SVG规范: 要熟悉SVG的基本概念和规范,以便更好地使用Batik库处理图形。

性能考虑: 在处理大型SVG图形时,要注意性能问题,避免性能瓶颈。

2 矢量图转为PNG

在验证识别测试中,发现有些网站使用了SVG 矢量图,那么矢量图的处理有些独特的方法,处理不好,则无法进行识别,如何正确的处理主要有以下两部分:
1 获取的矢量图字符串
在这里插入图片描述
获取DIV标签内的矢量图字符串,该字符串经过了URL 编码 ,
如:

imgUrl=data:image/svg+xml;charset=utf8,%3Csvg%20preserveAspectRatio%3D%22none%20meet%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22188%22%20height%3D%2260%22%20viewBox%3D%220%2C0%2C188%2C60%22%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22%23cc9966%22%2F%3E%3Cpath%20fill%3D%22%23332f23%22%20d%3D%22M144.57%2030.07L144.56%2030.06L144.65%2030.15Q145.51%2030.48%20147.49%2030.48L147.37%2030.36L147 。。。

对URL 编码进行解码处理

 imgElement = driver.findElement(By.xpath("//div[contains(@style,'data:image/svg+xml;charset=utf8,')]"));
				String cssValue = (imgElement != null) ? imgElement.getCssValue("background-image") : null;
				String imgUrl = (cssValue != null && cssValue.contains("\"")) ? cssValue.split("\"")[1] : null;
				String imgBase64 = URLDecoder.decode(imgUrl.substring(32), "UTF-8");
				System.out.println(imgBase64);

2 将矢量图字符串 转换为PNG 后再进行识别

// 将SVG 转为PNG格式
	private byte[] svgTbyte(String imgBase64) {
		// 创建DocumentBuilderFactory
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse(new java.io.ByteArrayInputStream(imgBase64.getBytes()));

			// 序列化SVG为字符串
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");

			StringWriter writer = new StringWriter();
			transformer.transform(new DOMSource(document), new StreamResult(writer));
			String svgContent = writer.getBuffer().toString();

			// 使用TranscoderInput将SVG转换为PNG字节数组
			PNGTranscoder transcoder = new PNGTranscoder();
			TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(svgContent.getBytes()));
			ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
			TranscoderOutput output = new TranscoderOutput(pngOutputStream);
			transcoder.transcode(input, output);

			// 获取PNG字节数组
			byte[] pngBytes = pngOutputStream.toByteArray();
			return pngBytes;
		} catch (Exception e) {
			return null;
		}
	}

http://www.kler.cn/a/373923.html

相关文章:

  • 记一次:使用使用Dbeaver连接Clickhouse
  • 目录遍历漏洞
  • Javaee:阻塞队列和生产者消费者模型
  • Android 圆形进度条CircleProgressView 基础版
  • XCode16中c++头文件找不到解决办法
  • Django 5 增删改查 小练习
  • 数字普惠金融-工具变量(2024.2更新)
  • ubuntu 给终端设置代理
  • web文件包含include
  • 变压器漏感对整流电路的影响【电力电子技术3章】
  • 【jvm】空间分配担保策略
  • Rust 力扣 - 643. 子数组最大平均数 I
  • kafka中MirrorMaker1和MirrorMaker2的区别
  • 易保全创新“诉前调解+赋强公证”,提供便捷高效的纠纷解决途径
  • 关于springboot跨域与拦截器的问题
  • 在面试了些外包以后,我有了些自己的思考
  • LySocket 远程ShellCode注入工具
  • 20241031使用Rockchip原厂RK3566的Buildroot编译RK3399方案
  • 解决注册Kaggle出现的“Captcha must be filled out”问题
  • 022集——统计多条线的总长度(CAD—C#二次开发入门)
  • 玄机-应急响应- Linux入侵排查
  • 人工智能进程;算子加速的具体计算部分;大模型GPT5:参数18万亿;大模型面临问题
  • Javaweb梳理5——约束
  • 第十四章大数据和数据科学
  • ✨云桥计划✨
  • Netty核心源码与优化