javascript - 如何在 Vue.Js 中将图像 URL 从服务器(API / ImageURL)转换为 Base64
问题描述
我看到很多关于这个问题的参考,upload file and convert to base64
但在我的情况下,我想从服务器转换图像 URL 并将其转换为 base64,但我仍然未能做到,现在我像这样尝试过,但它仍然失败,因为它没有显示任何东西
这是我的html:
<div v-if="questionData">
<img class="img-preview-download" :src="questionData.image_url? getBase64Image(questionData.image_url) : 'https://via.placeholder.com/640x360'" alt="img-preview">
</div>
这是我的方法:
getBase64Image(img) {
console.log("cek base64 : ", btoa(img));
return `data:image/jpeg;base64,${btoa(img)}`;
},
我使用文件阅读器阅读了一些内容,但当您使用上传数据时,它不仅适用于文件input
吗?有人可以帮我解决这个问题吗?我正在为框架使用 Vue.Js
当我使用这种方法时,我得到了这样的结果:
解决方案
所以这是我对未来自己的回答,他可能会忘记并在这个问题中再次绊倒!
您可以通过制作一个新图像并在该图像文件中来解决它,您可以添加您src
的图像,以便在仍然加载或onload
.
记住!
既然是你,你可能会删除最后一个image.src = url
以获得干净的代码,但这很重要,如果你删除该行,image.onload
将不会被触发,因为它会搜索图像源。如果你尝试用它image.srcObject
来放置它mediaStream
会给你,Resolution Overloaded
因为你仍然没有找到这个问题的答案,没关系,你可以先使用图像,因为你的步骤是实现how to get file from Image URL
。所以这是你用来解决这个问题的方法:
downloadPreview() {
const el = this.$refs.printMe;
const options = {
type: 'dataURL'
};
this.$html2canvas(el, options).then(data => {
this.output = data;
const a = document.createElement('a');
a.style.display = 'none';
a.href = data;
// this is just optional function to download your file
a.download = `name.jpeg`;
document.body.appendChild(a);
a.click();
});
},
convertImgUrlToBase64(url) {
let self = this;
var image = new Image();
image.setAttribute('crossOrigin', 'anonymous'); // use it if you try in a different origin of your web
image.onload = function () {
var canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
canvas.getContext('2d').drawImage(this, 0, 0);
canvas.toBlob(
function(source) {
var newImg = document.createElement("img"),
url = URL.createObjectURL(source);
newImg.onload = function() {
// no longer need to read the blob so it's revoked
URL.revokeObjectURL(url);
};
newImg.src = url;
},
"image/jpeg",
1
);
// If you ever stumble at 18 DOM Exception, just use this code to fix it
// let dataUrl = canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream");
let dataUrl = canvas.toDataURL("image/jpeg");
console.log("cek inside url : ", url);
if(url === backgroundImg) {
self.assignImageBase64Background(dataUrl);
} else {
self.assignImageBase64(dataUrl);
}
};
image.src = url;
},
assignImageBase64(img) {
this.imgBase64 = img;
},
仅供参考,我使用此库将文件更改div
为image
:
vue-html2canvas
笔记:
如果你想知道我为什么self.assignImageBase64(dataUrl);
最后给出这个函数,这是因为我仍然想知道 onload 是如何工作的,以及如何将Base64
url 返回给父级,这就是为什么我只是在另一个函数中再次分配它,因为它更容易做到。
推荐阅读
- api - 如何使用 API 进行 Aadhar 身份验证和获取 KYC 详细信息
- amazon-web-services - 用于 aws 安全组的 Terraform 中的变量值
- javascript - 在 LightningChartJS 中重置 Axis CustomTicks
- javafx - 画布:将鼠标悬停在文本输出上
- dart - Dart 中的 const 构造函数初始化失败
- python - 将熊猫数据框转换为具有所有组合的字典
- python - 用于 INSERT INTO SELECT 模式的 Python 正则表达式/正则表达式
- c# - Mongodb查询以获取特定于c#的嵌套文档的值
- google-apps-script - 谷歌脚本在编辑时将值从一列复制并粘贴到另一列
- javascript - TypeScript如何访问promise方法中的字段