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

news2024/11/26 16:46:07

矢量图的介绍及应用场景

矢量图是什么意思?

矢量图,也称为向量图,英文名字是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.coloradmin.cn/o/2228224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈钓鱼攻防之道-制作免杀excel文件钓鱼

如果我告诉你我很厉害&#xff0c;也许你会说我在吹牛。但是如果我告诉你我并不厉害&#xff0c;你肯定知道我在撒谎。 1、CSV注入之RCE CSV公式注入(CSV Injection)是一种会造成巨大影响的攻击向量&#xff0c;攻击这可以向Excel文件中注入可以输出或以CSV文件读取的恶意攻击…

Linux Shell 实现一键部署mariadb11.6

mariadb MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius主导开发…

在 Elasticsearch 中顺利管理季节性时间变化

作者&#xff1a;来自 Elastic Valeriy Khakhutskyy, James Gowdy 用于 Elasticsearch 异常检测的新夏令时日历。 每年春季和秋季两次&#xff0c;许多国家/地区都会调整时钟以更好地利用日光。这些时钟调整不仅会带来时差和 “困倦的星期一” 的感觉&#xff0c;还会带来来自…

开源一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款基于若依的wms仓库管理系统&#xff0c;支持lodop和网页打印入库单、出库单的源码。 前言 在当今快速发展的商业环境中&#xff0c;库存管理对于企业来说至关重要。然而&#xff0c;许多企业仍然依赖于传统的、手动…

C++ | Leetcode C++题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution { public:int fib(int n) {if (n < 2) {return n;}vector<vector<int>> q{{1, 1}, {1, 0}};vector<vector<int>> res matrix_pow(q, n - 1);return res[0][0];}vector<vector<int>>…

「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用

在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。 关键词 Image 组件图片加载本地资源远程图片图片轮播一、Image 组件基础…

【CSS3】css开篇基础(5)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

怎么将文件批量重命名001到100?6个超好用的方法汇总

怎么将文件批量重命名001到100&#xff1f;在日常工作和学习中&#xff0c;我们经常需要处理大量的文件。这些文件可能包括文档、图片、音频、视频等各种类型&#xff0c;而它们的命名往往各不相同&#xff0c;这给我们的查找工作带来了很大的困扰。为了提高查找效率&#xff0…

【运动的&足球】足球运动员球守门员裁判检测系统源码&数据集全套:改进yolo11-DBBNCSPELAN

改进yolo11-FocalModulation等200全套创新点大全&#xff1a;足球运动员球守门员裁判检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.28 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示…

Linux_02 Linux常用软件——vi、vim

vi编辑器有三种主要模式&#xff0c;每种模式的功能和用途不同&#xff1a; 一、命令模式 (Command Mode)&#xff1a; - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标&#xff0c;输入各种命令&#xff08;如删除、复制、粘贴等&#xff09;。 yy&#xff1a;…

python 爬虫抓取百度热搜

实现思路&#xff1a; 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

51单片机STC8G串口Uart配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口&#xff1b;本文以串口1为例&#xff0c;串口1有4种工作方式…

电脑使用技巧:怎么清理C盘碎片?

在日常使用电脑的过程中&#xff0c;C盘作为系统盘&#xff0c;常常会因为各种文件、缓存、临时文件等的堆积而变得拥挤不堪。这不仅会降低电脑的运行速度&#xff0c;还可能导致系统不稳定。而磁盘碎片问题则是另一个影响电脑性能的重要因素。本文将详细介绍如何清理C盘碎片&a…

数据结构 ——— 二叉树的概念及结构

目录 二叉树的概念 特殊的二叉树 一、满二叉树 二、完全二叉树 二叉树的概念 二叉树树示意图&#xff1a; 从以上二叉树示意图可以看出&#xff1a; 二叉树每个节点的度不大于 2 &#xff0c;那么整个二叉树的度也不大于 2 &#xff0c;但是也不是每个节点都必须有 2 个…

什么样的职业适合参加TRIZ创新方法培训

当下&#xff0c;无论是科技巨头还是初创企业&#xff0c;甚至是传统行业&#xff0c;都在积极寻求创新的突破口&#xff0c;以期在激烈的市场竞争中脱颖而出。而在这场创新大潮中&#xff0c;TRIZ&#xff08;发明问题解决理论&#xff09;作为一种高效、系统的创新方法&#…

SQLark百灵连接——整合项目监控过程

关键词&#xff1a;SQL编写、数据查询、数据导入、达梦数据库、项目管理、信息透明 项目监控背景 作为新手项目经理的我&#xff0c;经常觉得哪儿哪儿都是问题&#xff0c;今天催这个&#xff0c;明天推那个&#xff0c;可就是什么事都推不动&#xff0c;谁都不配合。后来&…

Unity可视化Shader工具ASE介绍——自定义函数

阿赵的Unity可视化Shader工具ASE介绍目录   大家好&#xff0c;我是阿赵。   之前介绍过一些ASE的用法&#xff0c;发现漏了一个比较重要的&#xff0c;自定义函数的使用。这里补充一下。 一、 使用的场合 在使用ASE制作Shader的过程中&#xff0c;可能会遇到以下这些情况…

前端性能优化——缓存优化

前端性能优化可以从多个方面下手&#xff0c;例如加载性能优化、渲染性能优化、代码优化、缓存优化、性能监测和优化等方面下手&#xff0c;下面针对缓存优化分享一下优化思路。 浏览器缓存主要分为强缓存和协商缓存。强缓存命中时&#xff0c;浏览器直接从本地缓存中获取资源&…

Unity3D包管理bug某些版本Fbx Exporter插件无法搜索到的问题

这个问题是在使用unity的时候发现的 有些版本里没有Fbx Exporter插件也是没法搜到 经过测试&#xff0c;在package manager中开启Enable Preview Packages也没有用 这个插件在2020已经是正式版了&#xff0c;不需要再开启 后来发现可能是版本bug 需要手动开启 在工程的Pac…

03.DDD六边形架构

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 什么是依赖DDD四层架构六边形架构代码实现 想要详细了解六边形架构&#xff0c;可以看我之前的一篇文章。是对六边形架构原文的翻…