【发布时间】:2018-10-13 02:41:06
【问题描述】:
Firefox 不支持 SVG 图像的 2D 画布转换,但它支持 PNG 图片。
以下代码 sn-p 创建两个带有 2D 绘图上下文的 HTML 画布。对它们都应用了简单的缩放变换,然后在上面的一个上绘制一个 20px 大小的方形 PNG 图像,在下一个上绘制一个相同尺寸的 SVG。
在我的 Chromium (v65.0.3325.162) 上,图像按预期放大。但是,在 Firefox (v58.0.2) 上,底部的画布(带有 SVG 的画布)没有缩放,这与带有 PNG 源图像的画布不同。
function createPng(xSize, ySize) {
var canvas = document.createElement("canvas");
canvas.width = 20;
canvas.height = 20;
var ctx = canvas.getContext("2d")
ctx.fillStyle = "000000";
ctx.fillRect(0, 0, xSize, ySize);
var img = new Image()
prom = new Promise(function(resolve, reject) {
img.onload = function() {resolve(img)}
img.onerror = function(err) {reject(err)}
})
img.src = canvas.toDataURL("image/png");
return prom
}
function createSvg() {
var img = new Image()
var prom = new Promise(function(resolve, reject) {
img.onload = function() {resolve(img)}
img.onerror = function(err) {reject(err)}
})
img.src = "https://cdn.rawgit.com/AttilaVM/4e0987aae8bc37b2067fbde591088758/raw/95dcffd67b37540d739f4bd5f33f6bead625a90f/test.svg"
return prom
}
var containerPng = document.getElementById("container-png")
var canvasPng = document.createElement("canvas")
canvasPng.width = containerPng.clientWidth;
canvasPng.height = containerPng.clientHeight;
containerPng.appendChild(canvasPng);
var ctxPng = canvasPng.getContext("2d");
createPng(20, 20)
.then(function(img) {
ctxPng.scale(5, 1);
ctxPng.drawImage(img, 0, 0)
})
.catch(function(err) {console.error(err)});
var containerSvg = document.getElementById("container-svg")
var canvasSvg = document.createElement("canvas")
canvasSvg.width = containerSvg.clientWidth;
canvasSvg.height = containerSvg.clientHeight;
containerSvg.appendChild(canvasSvg);
var ctxSvg = canvasSvg.getContext("2d");
createSvg()
.then(function(img) {
ctxSvg.scale(5, 1);
ctxSvg.drawImage(img, 0, 0)
})
.catch(function(err) {console.error(err)});
.container {
position: relative;
margin: 15px 0 0 0;
width: 100%;
height: 20px;
background-color: #aaaaaa
}
.container > canvas {
position: absolute;
top: 0;
left: 0;
}
<div id="container-png" class="container"></div>
<div id="container-svg" class="container"></div>
截图
铬: 火狐:问题:
编写代码以在 HTML 画布上绘制缩放的 SVG 图像的最佳方法是什么,在 Firefox 和 Chromium 上给出相同的结果?
【问题讨论】:
标签: javascript firefox cross-browser html5-canvas