我正在尝试从网站下载一些图像。我一直在使用Jsoup进行抓取,并且之前已经成功下载了给定URL的图像,但是此网站上的图像为svg格式。没有链接到svg文件的位置,该图像嵌入svg标签中。我见过蜡染用于将svg文件转换为其他图像格式,但是我没有svg文件。
有什么办法吗?将不胜感激任何指导。谢谢。
最佳答案
通常,SVG图像不是文件,而是包含在来自浏览器的GET请求的响应正文中。要对此进行测试,可以下载一个REST客户端,POSTMAN(如果您使用的是Chrome),然后向svg的网址发出GET请求。响应将是SVG图像。现在就Java来考虑,您可能必须对代码进行一些解析才能仅获取实际的svg元素,因为该网站可能会返回多余的垃圾,从而封装了嵌入式svg。
我使用过蜡染布,由于种种原因,您认为这并不是一个好的解决方案。在过去,我最终编写了Java代码,该代码执行了第三方程序进行图像转换。基本上,它是一个Command类,包装了phantomjs的执行。下载phantomjs,并使用examples文件夹中的rasterize.js文件实现从.svg到.png或.jpg的快速,轻松的图像转换。在命令行中,phantomjs的命令类似于:
phantomjs rasterize.js C:\sourceImage.svg C:\outputImage.png
如果您要进行图像处理,那么我使用ImageMagick做了很多事情,因为phantomjs仅适用于将svg渲染为光栅化图像格式。
在您的情况下,您想要对URL上的每个svg图像进行操作,获取svg,将其解析为字符串,将该字符串写入文件,然后执行以下操作:
String command = "C:\\phantomjs\\phantomjs.exe C:\\phantomjs\\rasterize.js C:\\source.svg C:\\output.png"
Process process = Runtime.getRuntime().exec(command);
显然,使您的代码更通用,用可重用变量替换命令字符串中的值。
如果是在商业平台上,则可以在单个服务器上安装phantomjs和Java应用程序,然后仅通过REST端点将此应用程序连接到获取图像的svg finder应用程序。当svg finder应用获取图像时,对其进行解析,格式化,然后将其发布到phantomjs服务器以进行渲染以及上载/存储。