首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“HTMLElement”类型的参数不能分配给“CanvasImageSource”类型的参数

“HTMLElement”类型的参数不能分配给“CanvasImageSource”类型的参数
EN

Stack Overflow用户
提问于 2019-05-07 06:27:21
回答 3查看 74.9K关注 0票数 35

我正在尝试将相同的图像加载到HTML中的所有画布中。我以前用javascript写了我的整个网页,但现在我正在学习角和类型记录。

我在Visual代码中高亮显示了此错误:

类型'HTMLElement‘的参数不能分配给'CanvasImageSource’类型的参数。类型'HTMLElement‘缺少’HTMLVideoElement‘类型中的下列属性:身高、msHorizontalMirror、msIsLayoutOptimalForPlayback、msIsStereo3D和80 more.ts(2345)

但控制台中没有显示错误。我可以让图像加载到画布中的HTML上(因此它是工作的)。

这是我的ts:

代码语言:javascript
运行
复制
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-map',
  templateUrl: './map.component.html',
  styleUrls: ['./map.component.scss']
})
export class MapComponent implements OnInit {

  constructor() { }

  ngOnInit() {

    document.querySelectorAll("canvas").forEach(c=>{
      var ctx = c.getContext("2d");
      var img = document.getElementById("P43");
      ctx.drawImage(img,0,0,106,50); //(image, offsetx, offsety, x, y)
    });
  }

}

VS代码突出显示这行ctx.drawImage(img,0,0,106,50); //(image, offsetx, offsety, x, y)上的错误,它突出显示img并显示错误。

我试图搜索这个,但我找到的唯一解决方案是当您有标签的ID (我没有,因为它是画布‘在页面上“)。或者是否有输入。

任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-07 06:38:04

您必须告诉编译器,img变量被设置为HTMLImageElement

ctx.drawImage方法需要一个:

代码语言:javascript
运行
复制
HTMLOrSVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap;

如果您的P43是画布,您必须这样做:

代码语言:javascript
运行
复制
const img = document.getElementById("P43") as HTMLCanvasElement;

如果它是一个图像元素:

代码语言:javascript
运行
复制
const img = document.getElementById("P43") as HTMLImageElement;

更好的做法是,实际检查元素实际上是否是正确类型的Element。您可以使用instanceof来完成这个任务。TypeScript编译器还将获取if语句,在if语句中,img变量将是编译器的HTMLCanvasElement,因此不再需要显式强制转换:

代码语言:javascript
运行
复制
const img = document.getElementById("P43");

if (img instanceof HTMLImageElement) {
  ctx.drawImage(img,0,0,106,50);
} else {
  // wrong element!
}
票数 78
EN

Stack Overflow用户

发布于 2019-05-07 06:38:38

您需要告诉TS编译器您在组件中使用的HTML元素的特定类型。

在这里,您将查询文档对象,获取一些元素,并对这些元素调用一些方法。由于TypeScript无法推断这些元素的类型,因此产生编译器错误,因此需要显式地说明类型。

试试这个:

代码语言:javascript
运行
复制
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-map',
  templateUrl: './map.component.html',
  styleUrls: ['./map.component.scss']
})
export class MapComponent implements OnInit {

  constructor() { }

  ngOnInit() {

    document.querySelectorAll('canvas').forEach((c: HTMLCanvasElement) => {
      const ctx =  <CanvasRenderingContext2D> c.getContext('2d');
      const img = <HTMLImageElement> document.getElementById('P43');
      ctx.drawImage(img, 0, 0, 106, 50);
    });
  }
}
票数 3
EN

Stack Overflow用户

发布于 2021-04-05 11:00:15

如果您不能使用as HTMLImageElement,您可以根据需要使用这个语法来构造图像,它对我起了作用:

代码语言:javascript
运行
复制
var img = new Image(); // Image constructor
img.src = 'image.png';
img.alt = 'alt';

然后你可以使用:

代码语言:javascript
运行
复制
 ctx.drawImage(img,0,0);

Src:https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement#example

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

https://stackoverflow.com/questions/56016696

复制
相关文章

相似问题

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