首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将内联SVG另存为JPEG/PNG/SVG

将内联SVG另存为JPEG/PNG/SVG
EN

Stack Overflow用户
提问于 2015-01-30 07:31:01
回答 4查看 53.3K关注 0票数 38

我有一个内联SVG在我的html,我需要能够保存为JPEG,PNG或SVG。

我尝试了几种不同的方法,先将SVG转换为canvas,然后再转换为JPEG,但这些方法都无法正常工作。

下面是我的内联SVG的一个示例。

代码语言:javascript
复制
.font {
	color: #ffffff;
	font-family: Roboto;
	font-weight: bold;
	text-transform: uppercase;
}
.name {
	font-size: 64pt;
}
.top-bar-text {
	font-size: 32pt;
}
.font tspan {
	dominant-baseline: middle;
}
代码语言:javascript
复制
<link href='http://fonts.googleapis.com/css?family=Roboto:700' rel='stylesheet' type='text/css'>

<svg width="256" height="256" id="icon">
  <rect class="bg1" id="bg_color_1" x="0" y="0" width="256" height="256" fill="#4cbc5a" />
  <path class="bg2" id="bg_color_2" d="M 0 96 L0,256 L256,256 L256,96 s -128 96 -256 0" fill="#08a21c" />
  <text id="left_corner_text" x="24" y="36" width="48" height="64" class="top_bar lct font top-bar-text" text-anchor="middle" fill="#ffffff"><tspan>1</tspan></text>
  <text id="right_corner_text" x="232" y="36" width="48" height="64" class="top_bar rct font top-bar-text" text-anchor="middle" fill="#ffffff"><tspan>2</tspan></text>
  <text id="line_1_text" transform="scale(1,2)" x="128" y="90" width="256" height="192" class="l1t font name" text-anchor="middle" fill="#ffffff"><tspan>ABC</tspan></text>
</svg>

此外,并不是所有的元素都需要导出,因为用户拥有的一些选项是删除顶角编号。

我想当它被转换为直接下载到浏览器。

EN

回答 4

Stack Overflow用户

发布于 2019-08-08 07:59:11

在@CiroCosta上工作。1选项如果在导出元素时遇到问题,您可以在绘制svg图像之前将图像绘制到画布

代码语言:javascript
复制
btn.addEventListener('click', function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  var data = (new XMLSerializer()).serializeToString(svg);
  var DOMURL = window.URL || window.webkitURL || window;

  // get the raw image from the DOM
  var rawImage = document.getElementById('yourimageID');
  var img = new Image();
  var svgBlob = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});
  var url = DOMURL.createObjectURL(svgBlob);

  img.onload = function () {
    ctx.drawImage(rawImage, 0, 0);
    ctx.drawImage(img, 0, 0);
    DOMURL.revokeObjectURL(url);

    var imgURI = canvas
      .toDataURL('image/png')
      .replace('image/png', 'image/octet-stream');

    triggerDownload(imgURI);
  };

  img.src = url;
});

适用于我,但仅适用于png和jpeg。SVG文件仍然只显示内联元素,而不显示标记

编辑:创建这样的svg的方法实际上是将图像标记转换为Base64,并将其设置为图像属性中的xlink:href,如下所示:

代码语言:javascript
复制
<image id="crop" width="725" height="1764" xlink:href="data:image/png;base64,iVBORw0KGgo ... " />

然后在整个svg url上触发下载,如下所示:

代码语言:javascript
复制
btn.addEventListener('click', function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  var data = (new XMLSerializer()).serializeToString(svg);
  var DOMURL = window.URL || window.webkitURL || window;

  var rawImage = document.getElementById('yourimageID');
  var img = new Image();
  var svgBlob = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});
  var url = DOMURL.createObjectURL(svgBlob);

  img.onload = function () {
    ctx.drawImage(img, 0, 0);

    triggerDownload(url);
    DOMURL.revokeObjectURL(url);
  }
};

您可以像这样转换pngs:here

代码语言:javascript
复制
function getDataUri(url, callback) {
  var image = new Image();

  image.onload = function () {
    var canvas = document.createElement('canvas');
    canvas.width = this.naturalWidth; // or 'width' if you want a special/scaled size
    canvas.height = this.naturalHeight; // or 'height' if you want a special/scaled size

    canvas.getContext('2d').drawImage(this, 0, 0);

    // Get raw image data
    callback(canvas.toDataURL('image/png').replace(/^data:image\/(png|jpg);base64,/, ''));

    // ... or get as Data URI
    callback(canvas.toDataURL('image/png'));
  };

  image.src = url;
}

然后设置属性

代码语言:javascript
复制
getDataUri('localImagepath', function (dataUri) {
  image.setAttribute('xlink:href', dataUri);
});
票数 1
EN

Stack Overflow用户

发布于 2021-10-24 10:20:31

@ciro costa的答案确实有帮助,但除非设置画布高度和宽度,否则生成的png高度无法正常工作。

代码语言:javascript
复制
function downloadImg() {
  const svgElem = document.querySelector('svg')
  const serializer = new XMLSerializer();
  let svgData = serializer.serializeToString(svgElem);
  svgData = '<?xml version="1.0" standalone="no"?>\r\n' + svgData;
  const svgBlob = new Blob([svgData], {
    type: 'image/svg+xml;charset=utf-8',
  });
  let DOMURL = window.URL || window.webkitURL || window;
  const url = DOMURL.createObjectURL(svgBlob);

  const img = new Image();
  img.onload = () => {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    const domRect = svgElem.getBBox();
    canvas.width = domRect.width;
    canvas.height = domRect.height;
    ctx.drawImage(img, 0, 0, domRect.width, domRect.height);
    DOMURL.revokeObjectURL(url);

    const imgURI = canvas
      .toDataURL('image/png')
      .replace('image/png', 'image/octet-stream');

    download(imgURI);
  };
  img.onerror = (e) => {
    console.error('Image not loaded', e);
  };

  img.src = url;
}

function download(href) {
  let download = document.createElement('a');
  download.href = href;
  download.download = 'img.png';
  download.click();
  download.remove();
}
代码语言:javascript
复制
<svg width="256" height="256" id="icon">
      <rect class="bg1" id="bg_color_1" x="0" y="0" width="256" height="256" fill="#4cbc5a" />
    </svg>

<div>
  <button onclick="downloadImg()">Download</button>
</div>

票数 0
EN

Stack Overflow用户

发布于 2021-12-21 04:21:04

以此为例,但JavaScript部分对您来说是简化。

代码语言:javascript
复制
function SVGPNG(svg, cb) {
  let temp = document.createElement("img");
  let imageSrc = URL.createObjectURL(
    new Blob([svg], { type: "image/svg+xml" })
  );

  temp.src = imageSrc;
  temp.setAttribute("style", "position:fixed;left:-200vw;");
  document.body.appendChild(temp);
  temp.onload = function onload() {
    let canvas = document.createElement("canvas");
    canvas.width = temp.clientWidth;
    canvas.height = temp.clientHeight;
    let ctx = canvas.getContext("2d");
    ctx.drawImage(temp, 0, 0);
    let src = canvas.toDataURL("image/png");
    cb(src, canvas);
    temp.remove();
    URL.revokeObjectURL(imageSrc);
  };
}

function onPaste(e) {
  SVGPNG(e.target.value, (src) => {
    document.getElementById("output").value = src;
  });
}
代码语言:javascript
复制
body {
  font-family: system-ui;
  background: #f06d06;
  color: white;
  text-align: center;
}

textarea {
  border: solid 1px #ccc;
  border-radius: 10px;
  resize: none;
  outlined: solid 1px #999;
}
代码语言:javascript
复制
<textarea cols="60" rows="20" autofocus onchange="onPaste">Paste your SVG code here...</textarea>
<textarea cols="60" rows="20" readonly id="output">Your output here...</textarea>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28226677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档