html - 如何立即将上传的图像显示为画布背景?
问题描述
我正在使用打字稿将用户上传的图像设置为画布背景。但是,我猜由于某些绑定问题,它仅在用户上传文件两次时才有效。在尝试将其设置为画布背景之前,如何等待图像加载?
我试图仅在selectedFile
变量不为空时运行画布代码(见下文),但我遇到了同样的错误。
<input type="file" (change)="onFileChanged($event)">
<canvas id="canvas"></canvas>
private selectedFile: File = null;
private imgURL: any;
onFileChanged(event){
if(event.target.files.length == 0) return;
this.selectedFile = <File> event.target.files[0];
var reader = new FileReader();
reader.readAsDataURL(this.selectedFile);
reader.onload = (_event) => {this.imgURL = reader.result;}
var canvas : any = document.getElementById("canvas");
var ctxt = canvas.getContext("2d");
var background = new Image();
background.src = this.imgURL;
background.onload = function () {
ctxt.drawImage(background, 0, 0, canvas.width, canvas.height);
};
}
我希望画布将所选图像显示为背景。但是,用户第一次上传图片时,输出为GET http://localhost:4200/undefined 404 (Not Found) Image (async)
. 当用户上传不同的图像时,背景会更新为第一个选择的图像。
解决方案
我认为您需要做的就是将您的画布代码放入reader.onload
回调中。
onFileChanged(event) {
if (event.target.files.length == 0) return;
this.selectedFile = < File > event.target.files[0];
var reader = new FileReader();
reader.readAsDataURL(this.selectedFile);
reader.onload = (_event) => {
this.imgURL = reader.result;
var canvas: any = document.getElementById("canvas");
var ctxt = canvas.getContext("2d");
var background = new Image();
background.src = this.imgURL;
background.onload = function() {
ctxt.drawImage(background, 0, 0, canvas.width, canvas.height);
};
}
}
您可能会收到错误,因为您的.onload
异步回调尚未触发,并且this.imgURL
会undefined
在您尝试使用它时触发。现在它会等到我们有了 imgURL 的值后才使用它。
推荐阅读
- java - 如何在一个地方处理不同类型的异常?
- gpu - 如何使用 GPU 训练 spaCy 实体链接模型?
- android - 在 MapActivity (ESRI) 中显示 mmpk
- python - 关于表单、视图和动态查询集的问题
- android - Android - 设置粗体/斜体后再次使 EditText 正常
- arrays - 如何根据 shell 函数返回值创建“简历结构”
- jsonschema - 如何在 JSON 模式验证器中表示联合类型?
- python - 转换数据 Pyspark python
- php - 查询可为空的 VARCHAR 列失败并出现 PDO
- python - python循环遍历列表并在随机点停止