将内联 SVG 转换为 png 时出现样式错误

2024-03-29

我的高级目标是转变<div>包含一些内联 svg 图像到 png 文件的元素。所有操作都必须使用 JavaScript 在客户端浏览器中执行。我努力了:

  1. 使用 canvg 库并按照本文中的步骤操作:https://github.com/niklasvh/html2canvas/issues/95#issuecomment-34439223 https://github.com/niklasvh/html2canvas/issues/95#issuecomment-34439223

    原始 svg:

    result:

  2. 将 css 样式扁平化为<svg>标记,然后调用 canvg,按照本文中的步骤操作:将嵌入的 SVG 就地转换为 PNG https://stackoverflow.com/questions/5433806/convert-embedded-svg-to-png-in-place/21318963#21318963

    结果:空白图像。

  3. 将 css 样式扁平化为<svg>标记并手动将 svg 绘制到画布上,按照本文中的步骤操作:如何将使用 css 样式的内联 SVG 从浏览器保存/导出到图像文件 https://stackoverflow.com/questions/15181452/how-to-save-export-inline-svg-styled-with-css-from-browser-to-image-file/18006981#18006981

    结果:空白图像。

  4. 使用以下代码将 css 样式展平为内联样式表:http://spin.atomicobject.com/2014/01/21/convert-svg-to-png/ http://spin.atomicobject.com/2014/01/21/convert-svg-to-png/

    结果:空白图像。

  5. using svg 撬棍 http://nytimes.github.io/svg-crowbar/手动下载<div>元素作为 .svg 文件。

    result:

    然后,当我将原始 svg 的计算 css 与下载的 svg 进行比较时,我发现下载的 svg 具有正确的 svg xml,但内联样式表不正确(<style type="text/css">)例如图表最右侧的数字 200、300,它们是用<text x="214" dy=".32em" y="0" style="text-anchor: start;">200</text>在我的外部 CSS 中,我有:

    .scatterChart .axisGraphicsContext 文本 { 字体大小:8px; 填充:#777; }

    但是,下载的 svg 的内联样式表中缺少字体大小和填充属性。


我一直在寻找一种解决方案,使用通过 Rickshaw 创建的 CSS(基于 D3)导出 PNG。我发现的唯一解决方案是:

  • 将 DIV 与 SVG 区别对待,并单独对待它们
  • 使用 html2canvas 将 DIV(和其他非 SVG 内容)转换为 canvas
  • 使 CSS 内联到 SVG; @thirdcreed 已在以下位置发布了 JavaScript 代码和 D3 选择器:JSDOM 中的人力车 CSS/轴 https://stackoverflow.com/questions/21996847/rickshaw-css-axes-in-jsdom- 根据需要将其适应您的自定义 CSS。
  • 使用以下代码将 SVG 转换为画布

    var imgsrc = 'data:image/svg+xml;base64,'+ btoa(html2);
    var img = '<img src="'+imgsrc+'">';      
    var canvas = document.querySelector("canvas"),
    context = canvas.getContext("2d");      
    var image = new Image;
    image.src = imgsrc;
    image.onload = function() {
      context.drawImage(image, 0, 0);
    }
    
  • 将您拥有的不同画布合并为一张
  • 使用以下代码转换为图像:

    var canvasdata = canvas.toDataURL("image/png");
    var pngimg = '<img src="'+canvasdata+'">'; 
    d3.select("#pngdataurl").html(pngimg); // contains selector from D3, adjust if you don't use D3
    var a = document.getElementById("some_anchor"); // Fix for Firefox: supply an anchor-tag here that is 'display:none' in your document, otherwise download won't work
    a.download = "sample.png";
    a.href = canvasdata;
    a.click();
    

请注意,每个支持 Internet Explorer 的浏览器都要求 SVG 具有 xmlns 属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将内联 SVG 转换为 png 时出现样式错误 的相关文章

  • JavaScript 中的可选参数

    如果缺少剩余参数 为什么该函数不会抛出错误 showStatistics Mark Teixeira New York Yankees 1st Base 这是定义的函数 function showStatistics name team p
  • Google javascript 登录 api:无法离线访问

    我正在尝试为服务器端应用程序实现 Google 登录 如 Google 文档中所示 服务器端应用程序的 Google 登录 https developers google com identity sign in web server si
  • Express.js - 监听关闭

    我有一个使用 Express 的 Node js 应用程序 在该应用程序中 我有一个如下所示的块 const app require app const port process env PORT 8080 const server app
  • Bootstrap shown.bs.tab 事件不起作用

    我正在使用灵活的模板 http the8guild com themes html flexy v1 7 stylesPage html 使用引导程序 并且我无法让选项卡上的 shown bs tab 事件正常工作 我已经成功让它发挥作用J
  • 角度引导手风琴数据绑定问题

    我有 2 个相同型号的下拉菜单 一个位于手风琴内部 另一个位于外部 外部下拉菜单在 2 路数据绑定方面工作良好 但手风琴内部的下拉菜单似乎只有 1 路绑定 换句话说 在 UI 中选择并不会设置模型值 我找到了一个建议here https s
  • 如何在 Angular2 中为表单分配和验证数组

    我的模型 this profile 在 javascript 中有一个属性叫做emails 这是一个数组 email isDefault status 然后我将其定义如下 this profileForm this formBuilder
  • 如何使用 Selenium webdriver 测试对 SVG 对象的点击?

    我正在尝试编写代码来检查单击 SVG 对象的功能 例如此 URL 上的美国州 http www amcharts com svg maps map usa 这可行 但是有更好的方法吗 不需要物理移动鼠标的东西 robert new Robo
  • 可点击的进度条

    我正在使用 Angular 并在 JavaScript 的帮助下开发了一个可点击的进度条 这是我能做到的最好的 有没有办法将滑块放置在进度条内但不干扰进度可视化 堆栈闪电战 https stackblitz com edit angular
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • 有没有办法显示嵌套在 Grid 组件内的 Material-UI 抽屉?

    我正在使用 Material UI 创建一个 Web 应用程序 主页分为 3 个网格 每个网格有一个height of 500px 我想在中间网格内显示一个带有一些操作选项的抽屉 那可能吗 到目前为止 我只能在整个屏幕上显示它 这是我的主要
  • CSS 按钮将线性渐变背景转换为透明背景

    我有一个带有线性渐变背景 橙色边框和一些文本的按钮 当我将鼠标悬停在按钮上时 我希望背景变得透明 而不更改按钮的其他属性 我尝试将不透明度转换为 0 但显然 这会隐藏边框和文本 我也尝试过转换背景 但它不起作用 因为我没有要转换到的端点 因
  • Array.indexOf 如何比 Array.some 更高效

    这个问题的灵感来自于这个问题的竞争答案 具有多个参数的indexOf https stackoverflow com questions 39000151 indexof with multiple arguments 用户想知道一种有效的
  • 将命令行参数传递给 emscripten 生成的应用程序

    当使用 Emscripten 编译 C 程序时 会生成一个 HTML 页面来显示程序的结果 我想知道如何将命令行参数传递给应用程序 例如 对于原始的 C 程序 它是 bfs 32 1 我能够通过向生成的 html 文件添加一行来传递命令行参
  • 放大 div 内的图像而不移动 div

    如何使图像在此 div 比例内 而不在悬停时进行实际的 div 缩放 所以我只想放大图像 这是代码 div img src some image div Use transform scale container display inlin
  • 谷歌浏览器不显示一个网站的alert()弹出窗口

    我正在开发一个 javascript 循环 该循环会随着循环的进行而提醒每个键值 为了加快速度 我选中了 阻止此页面创建其他对话框 框 通常这只会抑制一个例程的弹出窗口 但它们还没有回来 在 Google Chrome 中 alert 消息
  • 如何使用 Ajax 对 Oracle APEX 表格表单执行逐行验证?

    使用我执行的相同验证 处理 基于此线程 在 Oracle APEX v4 2 2 中通过 Ajax 调用 Oracle 函数进行现场验证 https stackoverflow com questions 21474303 calling
  • 您最喜欢的 JS/CSS 下拉菜单是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 希望在网站上实现一个 只是好奇其他人都使用过什么以及他们有过什么样的体验 EDIT我也不是一个超级粉丝
  • 我应该采取什么圆角方法?

    因此 关于圆角的信息并不缺乏 我已经经历过其中的大部分 我发帖是为了征求社区对这一点的意见 我的场景是 我们正在开发一个圆角相关设计 主要用于交互
  • 如何设置 .eslintrc 来识别“require”?

    我是新来的ESLint http eslint org 并且我已经成功地将 ESLint 与IntelliJ https www jetbrains com idea 开箱即用 我的 ESLint 集成无法识别node 但对文档的基本审查表
  • 为什么 JavaScript 默认导出不可用?

    为什么默认导出不像命名导出那样实时 lib js export let counter 0 export function incCounter counter export default counter main1 js import

随机推荐