首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeMismatchError in drawImage()

TypeMismatchError in drawImage()
EN

Stack Overflow用户
提问于 2015-03-31 13:05:32
回答 2查看 1.8K关注 0票数 1

我在用drawImage()。这是我的密码。imDiv持有一个内联svg。

代码语言:javascript
复制
  var c =document.getElementById( 'cvs' );
  var ctx =c.getContext( '2d' );
  var img =document.getElementById( 'imDiv' );
   ctx.drawImage( img, 0, 0 );  //TypeMismatchError

我收到了一个TypeMismatchError错误。原因可能是什么,我如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 23:07:51

您必须首先将SVG转换为图像,然后将图像绘制到画布上。

有些事情你需要考虑:

  • SVG必须格式良好(考虑XML)。
  • SVG中的第一个元素必须是xmlns属性。
  • 当涉及到foreignObject (嵌入HTML等)时,会有不同的安全限制,这取决于浏览器。它会在一些地方工作(火狐,没有外部引用),另一些则不起作用(f.ex )。(铬)这目前处于真空状态,在客户端我们对此无能为力。

下面是这样做的一种方法:

代码语言:javascript
复制
// Inline SVG:
var svg = document.querySelector('svg').outerHTML,  // make sure SVG tags are included
  canvas = document.querySelector('canvas'),        // target canvas
  ctx = canvas.getContext('2d');

// convert to image (see function below)
// converting to image is an asynchronous process, so we need a callback
svgToImage(svg, function(img) {

  // HERE you could insert the image to DOM:
  // var myElement = document.getElementById(elementID);
  // myElement.appendChild(img);
  
  // set canvas size = image
  canvas.width = img.width;
  canvas.height = img.height;

  // draw SVG-image to canvas
  ctx.drawImage(img, 0, 0);
});

// this will convert an inline SVG to a DATA-URI
function svgToImage(svg, callback) {
  var url = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(svg),
      img = new Image;

  // handle image loading, when done invoke callback
  img.onload = function() {
    callback(this);
  };

  img.src = url;
}
代码语言:javascript
复制
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
  <linearGradient id="gradient">
    <stop offset="0%" stop-color="#00f" />
    <stop offset="100%" stop-color="#f70" />
  </linearGradient>
  <rect fill="url(#gradient)" x="0" y="0" width="100%" height="100%" />
</svg>

<br>
<canvas></canvas><br>

票数 1
EN

Stack Overflow用户

发布于 2015-03-31 17:26:00

到目前为止,不可能在画布上绘制divsvg元素。传递给context.drawImage()的第一个参数必须是Image、画布,甚至是视频元素(使用svg可能会导致TypeMismatchError)。

因此,您可以使用getElementById()检索文档上的实际getElementById(),或者用new Image()创建文档。

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

https://stackoverflow.com/questions/29369403

复制
相关文章

相似问题

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