Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将SVG转换为PNG时裁剪的图像

将SVG转换为PNG时裁剪的图像
EN

Stack Overflow用户
提问于 2016-06-14 19:21:52
回答 2查看 916关注 0票数 1

将SVG保存为PNG时,保存的图像仅包含在viewbox/window中渲染的SVG。如何保存包含整个SVG的大型PNG?

代码语言:javascript
运行
AI代码解释
复制
// SVG element and XML string.
var svg = document.querySelector('svg');
var svgData = new XMLSerializer().serializeToString(svg);

// Canvas to hold the image.
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');

// Canvas size = SVG size.
var svgSize = svg.getBoundingClientRect();
canvas.width = svgSize.width;
canvas.height = svgSize.height;

// Image element appended with data.
var img = document.createElement('img');
img.setAttribute('src', 'data:image/svg+xml;base64,' + btoa(svgData));

img.onload = function() {
    // Draw image on canvas and convert to URL.
    context.drawImage(img,0,0);
    console.log(canvas.toDataURL('image/png'));
};
EN

回答 2

Stack Overflow用户

发布于 2016-06-14 20:05:06

而不是:

代码语言:javascript
运行
AI代码解释
复制
var svgSize = svg.getBoundingClientRect();

使用:

代码语言:javascript
运行
AI代码解释
复制
var svgSize = svg.viewBox.baseVal;

这将使您了解viewBox的真实尺寸。

参考文献

https://stackoverflow.com/a/7682976/2813224

代码段

代码语言:javascript
运行
AI代码解释
复制
// SVG element and XML string.
var svg = document.querySelector('svg');
var svgData = new XMLSerializer().serializeToString(svg);

// Canvas to hold the image.
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');

// Canvas size = SVG size.
var svgSize = svg.viewBox.baseVal;
canvas.width = svgSize.width;
canvas.height = svgSize.height;

// Image element appended with data.
var img = document.createElement('img');
img.setAttribute('src', 'data:image/svg+xml;base64,' + btoa(svgData));

img.onload = function() {
    // Draw image on canvas and convert to URL.
    context.drawImage(img,0,0);
    console.log(canvas.toDataURL('image/png'));
};
代码语言:javascript
运行
AI代码解释
复制
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="64px" height="64px" viewBox="-0.5 0.5 64 64" enable-background="new -0.5 0.5 64 64" xml:space="preserve">
<g>
	<circle fill="#FFFFFF" cx="31.325" cy="32.873" r="30.096"/>
	<path id="text2809_1_" d="M31.5,14.08c-10.565,0-13.222,9.969-13.222,18.42c0,8.452,2.656,18.42,13.222,18.42   c10.564,0,13.221-9.968,13.221-18.42C44.721,24.049,42.064,14.08,31.5,14.08z M31.5,21.026c0.429,0,0.82,0.066,1.188,0.157   c0.761,0.656,1.133,1.561,0.403,2.823l-7.036,12.93c-0.216-1.636-0.247-3.24-0.247-4.437C25.808,28.777,26.066,21.026,31.5,21.026z    M36.766,26.987c0.373,1.984,0.426,4.056,0.426,5.513c0,3.723-0.258,11.475-5.69,11.475c-0.428,0-0.822-0.045-1.188-0.136   c-0.07-0.021-0.134-0.043-0.202-0.067c-0.112-0.032-0.23-0.068-0.336-0.11c-1.21-0.515-1.972-1.446-0.874-3.093L36.766,26.987z"/>
	<path id="path2815_1_" d="M31.433,0.5c-8.877,0-16.359,3.09-22.454,9.3c-3.087,3.087-5.443,6.607-7.082,10.532   C0.297,24.219-0.5,28.271-0.5,32.5c0,4.268,0.797,8.32,2.397,12.168c1.6,3.85,3.921,7.312,6.969,10.396   c3.085,3.049,6.549,5.399,10.398,7.037c3.886,1.602,7.939,2.398,12.169,2.398c4.229,0,8.34-0.826,12.303-2.465   c3.962-1.639,7.496-3.994,10.621-7.081c3.011-2.933,5.289-6.297,6.812-10.106C62.73,41,63.5,36.883,63.5,32.5   c0-4.343-0.77-8.454-2.33-12.303c-1.562-3.885-3.848-7.32-6.857-10.33C48.025,3.619,40.385,0.5,31.433,0.5z M31.567,6.259   c7.238,0,13.412,2.566,18.554,7.709c2.477,2.477,4.375,5.31,5.67,8.471c1.296,3.162,1.949,6.518,1.949,10.061   c0,7.354-2.516,13.454-7.506,18.33c-2.592,2.516-5.502,4.447-8.74,5.781c-3.2,1.334-6.498,1.994-9.927,1.994   c-3.468,0-6.788-0.653-9.949-1.948c-3.163-1.334-6.001-3.238-8.516-5.716c-2.515-2.514-4.455-5.353-5.826-8.516   c-1.333-3.199-2.017-6.498-2.017-9.927c0-3.467,0.684-6.787,2.017-9.949c1.371-3.2,3.312-6.074,5.826-8.628   C18.092,8.818,24.252,6.259,31.567,6.259z"/>
</g>
</svg>

票数 2
EN

Stack Overflow用户

发布于 2016-06-15 01:27:02

这是因为您将画布大小设置为呈现的svg大小。在CSS中,您可能需要调整svg的大小,这会导致计算大小与自然大小之间的差异。

默认情况下,如果不传递这些参数,drawImage(img, dx, dy, dWidth, dHeight)将使用源的宽度和高度作为destinationWidth和destinationHeight。

您可以检查此示例,该示例显示了与光栅图像相同的行为:

代码语言:javascript
运行
AI代码解释
复制
window.onload = function(){

var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');

var svgSize = inDoc.getBoundingClientRect();
canvas.width = svgSize.width;
canvas.height = svgSize.height;

var img = document.createElement('img');
img.setAttribute('src',  inDoc.src);

img.onload = function() {
  context.drawImage(img,0,0);
  document.body.appendChild(canvas);
};
}
代码语言:javascript
运行
AI代码解释
复制
img{ width: 64px; height: 64px}
代码语言:javascript
运行
AI代码解释
复制
<img id="inDoc" src="http://lorempixel.com/128/128"/>

这是一个小图形,展示了正在发生的事情。

因此,解决方案就是将画布的widthheight属性设置为img的属性,就像对任何其他源所做的那样:

代码语言:javascript
运行
AI代码解释
复制
img.onload = function(){
    canvas.width = this.width;
    canvas.height = this.height;
    ctx.drawImage(this, 0,0);
    }

如果你想包含一些比例因子:

代码语言:javascript
运行
AI代码解释
复制
img.onload = function(){
    canvas.width = this.width * scale;
    canvas.height = this.height * scale;
    ctx.drawImage(this, 0,0, canvas.width, canvas.height);
    }

现在,一个与你的实际代码无关,但仍然是光栅图像和svg图像之间的巨大差异是svg widthheight可以设置为相对单位(如%)。

浏览器没有关于它与什么相关的直接线索。(Chrome做了一个猜测,我不知道怎么做,其他人不会渲染你的图像)。

因此,在导出到dataURI之前,您需要检查以下内容:

代码语言:javascript
运行
AI代码解释
复制
var absoluteUnits = [1,5,6,7,8,9,10];
if (absoluteUnits.indexOf(svg.width.baseVal.unitType)<0) {
    svg.setAttribute('width', aboluteWidth);
    }
if (absoluteUnits.indexOf(svg.height.baseVal.unitType)<0) {
    svg.setAttribute('height', aboluteHeight);
    }

这里,absoluteWidthabsoluteHeight可以是svg.getBoundingClientRect()的结果。

还要注意,IE9不能显示img.widthimg.height值,因此您必须为它设置一个特例……..。但是由于您应该已经检查了absoluteSize,所以这应该不是问题:

代码语言:javascript
运行
AI代码解释
复制
var svg = document.querySelector('svg');
// we'll use a copy to not modify the svg in the document
var copy = svg.cloneNode(true);
var absoluteWidth, absoluteHeight, BBox;
var absoluteUnits = [1,5,6,7,8,9,10];

if (absoluteUnits.indexOf(svg.width.baseVal.unitType)<0) {
  BBox = svg.getBoundingClientRect();
  absoluteWidth = BBox.width
  copy.setAttribute('width', absoluteWidth);
  }
else{
  absoluteWidth = svg.getAttribute('width');
  }
if (absoluteUnits.indexOf(svg.height.baseVal.unitType)<0) {
  if(!BBox){
     BBox = svg.getBoundingClientRect();
    }
  absoluteHeight = BBox.height;
  copy.setAttribute('height', absoluteHeight)
  }
else{
  absoluteHeight = svg.getAttribute('height');
  }

var svgData = new XMLSerializer().serializeToString(copy);

var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');

var img = document.createElement('img');
img.setAttribute('src', 'data:image/svg+xml;base64,' + btoa(svgData));

img.onload = function() {
    // here you set your canvas width and height
    canvas.width = this.width || absoluteWidth;
    canvas.height = this.height || absoluteHeight;

    context.drawImage(img,0,0);
    document.body.appendChild(canvas);
};
代码语言:javascript
运行
AI代码解释
复制
svg{width: 64px; height:64px; border: 1px solid green;}
canvas{border: 1px solid blue;}
代码语言:javascript
运行
AI代码解释
复制
<svg width="128px" height="128px" viewBox="0 0 128 128">
  <rect x="20" y="20" width="84" height="84"/>
</svg>

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

https://stackoverflow.com/questions/37820449

复制
相关文章
使用Python将SVG文件转换为PNG文件
SVG(Scalable Vector Graphics)是一种基于XML的矢量图像格式,它可以在不失真的情况下无限放大。然而,不是所有的设备和应用都支持SVG格式,而PNG(Portable Network Graphics)格式在互联网上得到了广泛的支持,它支持透明度并且无损压缩。因此,有时我们需要将SVG文件转换为PNG文件,以便在更多的环境中使用。
运维开发王义杰
2023/08/10
2K0
使用Python将SVG文件转换为PNG文件
将png格式的图像转换为jpg
import osfrom PIL import Imagedirname_read="D:\dataset\cityscapes\cityscape_voc_clean\JPEGImages_png\\"dirname_write="D:\dataset\cityscapes\cityscape_voc_clean\JPEGImages_jpg\\"names=os.listdir(dirname_read)count=0for name in names: img=Image.open(dirna
狼啸风云
2020/07/16
2.4K0
Python完成SVG转PNG格式
一、完成目标: 将SVG格式的图标转换为PNG格式的图标,并预览 二、任务分析: svg是什么格式 : svg格式的图像可任意放大图形显示,而且边缘异常清晰,生成的文件很小,方便传输,文字在svg图像中保留可编辑和可搜寻的状态,没有字体的限制 png是什么格式 : PNG. ( 1996-10-01 ). 便携式网络图形 (英语: Portable Network Graphics , PNG ) 是一种支持 无损压缩 的 位图 图形格式,支持索引、 灰度 、 RGB 三种颜色方案以及 Alpha通道
Elsa_阿尼
2021/07/15
4K0
Python完成SVG转PNG格式
将tensor转换为图像_tensor转int
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
12.5K0
Python完成SVG转PNG格式——方法二
1、有很多博客是让大家去github的GTK+ for Windows Runtime Environment Installer: 64-bit去下载,但是有时会加载不了网页
Elsa_阿尼
2021/07/16
5.5K0
Python完成SVG转PNG格式——方法二
将图片转换为像素风svg
阿超
2023/06/23
2390
将图片转换为像素风svg
WPF 将 SVG 转 XAML 的工具
团队的设计师喜欢输出 SVG 格式的图片,而咱如果想要在 WPF 中高性能呈现出来,最好还是转换为 XAML 代码。本文来安利大家一些 SVG 转 XAML 的工具
林德熙
2021/04/15
4.2K0
BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点
一张图片可以储存为多种格式,为什么有的几十KB,有的几百MB,有的静止不动,有的是好几个画面循环播放?在项目开发的过程中经常会读取或保存图像文件,不同类型的图像特点不同,适用的范围也不同,简要介绍BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点。
不脱发的程序猿
2021/01/20
4.6K0
小技巧:如何用 Chrome 将 SVG 转成 PNG
怎么把 SVG 转成 PNG ?用 Chrome 吧,非常好用,还能设定自己想要的尺寸。
GoCoding
2021/05/06
2.5K0
小技巧:如何用 Chrome 将 SVG 转成 PNG
R将SVG文件转换成pdf或者png
svg是一种矢量图文件,一般的图片查看工具是无法打开的。那么如何正常打开svg格式的文件?下面小编就给大家介绍一下打开svg格式文件的方法,希望对大家有所帮助。
生信交流平台
2022/09/21
1.2K0
R将SVG文件转换成pdf或者png
小谈PNG转SVG的方法 在线转换网站与illustrator
本文主要探讨JPG/PNG转SVG矢量格式并支持FILL的方法,介绍在线转换网站和通过illustator转换的经验。
零云
2023/07/24
2.8K0
小谈PNG转SVG的方法 在线转换网站与illustrator
python将webp格式的图片转换为png格式
#!/usr/bin/env python # -*- coding:utf-8 -*- import os import time from multiprocessing.dummy import Pool from PIL import Image # tinypng 批量将文件夹下的webp文件转换为png格式 def convert(pic): pic_list = pic.split('.') name = pic_list[0] # print(name)
槽痞
2020/06/23
2.5K0
PHP开发之将jpng的图片转换为png格式
上午遇到了一个需求.就是将小程序生成的码拼接个文字.小程序生成二维码也好.小程序码也罢.这些之前都有接触过.三下五除二就生成了.接下来的工作也是需要进行文字的拼接.
桑先生
2020/02/13
1.6K0
Python3.7将普通图片(png)转换为SVG图片格式并且让你的网站Logo(图标)从此”动”起来
    首先第一步,先要将静态图做一步转换,以本站的logo作为例子,原理就是在普通的RGB图像阵列中将其像素进行转码操作,并且输出为svg特有的路径属性,当然了使用python进行图像操作少不了会用到鼎鼎大名的pillow模块
用户9127725
2022/08/08
1K0
Python3.7将普通图片(png)转换为SVG图片格式并且让你的网站Logo(图标)从此”动”起来
图像裁剪
PNG (460, 460) RGB {'srgb': 0, 'gamma': 0.45455, 'dpi': (96, 96)} None
裴来凡
2022/05/29
1.7K0
图像裁剪
PHP将png透明背景图片转换为白色背景
前一篇文章中,刚介绍了如何读取PDF文件并转换为png图片,最终图片能正常生成,但遇到了一个问题,生成的图片背景是透明的,那么如何将透明的图片转换为白色背景呢?
用户8851537
2021/08/19
2.5K0
PHP将png透明背景图片转换为白色背景
前一篇文章中,刚介绍了如何读取PDF文件并转换为png图片,最终图片能正常生成,但遇到了一个问题,生成的图片背景是透明的,那么如何将透明的图片转换为白色背景呢?
Petrochor
2022/06/07
8980
点击加载更多

相似问题

裁剪svg图像并将其转换为png

110

将SVG转换为PNG图像

20

将svg转换为png时,svg中的嵌入图像消失

35

尝试将SVG图像转换为PNG图像

012

SkiaSharp将SVG转换为PNG图像

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档