所以正如标题所说,我正在尝试加载一个base64编码的png图像到一个p5js图像,这里有一个简化的我是如何做的:
PS:我使用base64映像,因为它是从服务器生成的
var img;
function setup() {
// Canvas setup code ....
img = loadImage('loading.png'); // show an image which says that it's loading
img.loadPixels();
// More setup code ...
}
// ...
function draw() {
image(img, 0, 0, img.width, img.height);
// ... more code
}
// ...
function receivedCallback(data) { // This function gets called once we receive the data
// Data looks like this: { width: 100, height: 100, data: "...base64 data...." }
img.resize(data.width, data.height);
var imgData = data.data;
var imgBlob = new Blob([imgData], { type: "image/png" }); // Create a blob
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(imgBlob); // Craft the url
img.src = imageUrl;
img.loadPixels();
img.updatePixels();
}
但是,它不工作,这就是为什么我在这里问。如果有任何方法可以做到这一点,我会非常感激。提前感谢。
编辑Steve的不太好用,我不得不用img = loadImage('data:image/png;base64,' + data.data);
替换img.src = 'data:image/png;base64,' + data.data
3条答案
按热度按时间bgibtngc1#
你可以直接使用Data URLs,它看起来像这样:
如果出于某种原因需要使用blob,可以考虑base64到blob的转换,比如this answer。
mwkjh3gx2#
Steve的并不太好用,我不得不加载图像而不是直接改变它的源代码,所以我选择了
img.src = 'data:image/png;base64,' + data.data
。我需要做
img = loadImage('data:image/png;base64,' + data.data);
感谢史蒂夫的回答!
ia2d9nvy3#
从P5.js中的文件加载base64图像和常规图像没有区别,只需将
loadImage
调用中的URL替换为base64数据即可。为了获得一个可运行的完整示例(注意base64映像非常小):
如果你的数据应该在未来某个不确定的时间点加载,比如说,在交互之后,那么你可以使用回调来确定图像何时加载,这在某种程度上是特定于用例的,但是模式可能看起来像这样:
一个二个一个一个
如果你有一些异步代码,没有问题,只要你准备好base64字符串就调用
loadImage
,例如:尽管如此,对于大多数应用程序来说,通过点击来加载图像是一种有点奇怪的模式。通常,你会希望在
preload
函数中预加载所有的资产,以便在请求时立即呈现它们。如果你通过fetch
调用来加载图像以响应事件,在渲染图像之前,可能会有一个难看的延迟(或者需要显示一个临时消息/占位符图像/微调器),所以请确保这不是一个xy问题。