javascript - 使用 javascript img 将图像转换为 base64 字符串第一次未加载
问题描述
我尝试按照此 stacko 页面上显示的代码使用 javascript/angularjs 将图像转换为 base64 字符串,您也可以在此处详细检查代码。
function toDataURL(src, callback, outputFormat) {
var img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.naturalHeight;
canvas.width = this.naturalWidth;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
callback(dataURL);
};
img.src = src;
if (img.complete || img.complete === undefined) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}
}
toDataURL(
'https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0',
function(dataUrl) {
console.log('RESULT:', dataUrl)
}
)
我在控制器内部的 init 中调用了这个函数,但是当我加载页面时,图像第一次没有加载,但是如果我再次加载页面,图像就会加载。我还制作了一个按钮来再次调用该函数,并且正如预期的那样,在我加载页面并按下按钮后图像加载得很好。
调试代码我发现图像只有在到达最后一个 if 语句时才加载,如详细代码所示,该语句正在刷新缓存。但是既然它是第二次尝试,这不是正常的方法吗?
if (img.complete || img.complete === undefined) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}
到达这里后,它继续img.onload
并再次加载图像,这次图像加载得很好。
我错过了什么?我需要做些什么来等待图像加载吗?我可以做些什么让它稍后加载吗?或者是别的什么?
解决方案
原来我没有解决可以使用 ui-cropper 的 ImgPreview 的事实,因此不需要转换图像。我只在视图中创建了一个 $scope 来获取该 ImgPreview 并将其发送到数据库。可悲的是我无法提供任何代码。
推荐阅读
- office-ui-fabric - Office-UI-Fabric-React:如何替换 CommandBar 菜单中的“ChevronDown”和“ChevronRight”图标?
- javascript - 如何通过样式在反应中更改图标颜色 onHover?
- amazon-web-services - Amazon Keyspace TRUNCATE 指令不起作用
- kotlin - Kotlin For 循环从给定索引开始
- c++ - CLion 和 Qt5:调优 qmake
- java - Javafx:文本字段处理程序
- python - 仅在 Django Rest Framework 中验证
- python - 有没有更快的方法从 pyspark/python 中的 s3 读取数据
- r - 抓取功能仅适用于某些计算机 (R)
- python-3.x - Pygame 不会在 python 3.8 中导入