试图将 base64 png 图像转换为 p5.js 图像
Trying to get base64 png image into p5.js image
所以正如标题所说,我正在尝试将 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
可以直接使用Data URLs。它看起来像这样:
function receivedCallback(data) { // This function gets called once we receive the data
// Data looks like this: { width: 100, height: 100, data: "...base64 data...." }
loadImage('data:image/png;base64,' + data.data, function (newImage) {
img = newImage;
});
}
如果出于某种原因需要使用 blob,可以查看 base64 到 blob 的转换,例如 this answer。
史蒂夫完全 工作,我不得不加载图像而不是直接更改它的来源。
所以而不是 img.src = 'data:image/png;base64,' + data.data
.
我需要做 img = loadImage('data:image/png;base64,' + data.data);
感谢史蒂夫的回答!
从 P5.js 中的文件加载 base64 图像和普通图像没有区别。只需用 base64 数据替换 loadImage
调用中的 URL。
为了一个可运行的完整示例(注意 base64 图像非常小):
const imgData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII";
let img;
function preload() {
img = loadImage(imgData);
}
function draw() {
image(img, 0, 0);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.1/p5.min.js"></script>
如果您的数据应该在未来某个不确定的时间点加载,例如,在交互之后,您可以使用回调来确定图像加载的时间。这有点 use-case 具体,但模式可能如下所示:
const imgData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII";
let img;
function setup() {
createCanvas(300, 300);
}
function draw() {
clear();
textSize(14);
text("click to load image", 10, 10);
if (img) {
image(img, 0, 0);
}
}
function mousePressed() {
if (!img) {
loadImage(imgData, imgResult => {
img = imgResult;
});
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.1/p5.min.js"></script>
如果你有一些异步代码,没问题。准备好 base64 字符串后,只需调用 loadImage
,例如:
function mousePressed() {
if (!img) {
fetch("your endpoint")
.then(response => response.json())
.then(data => {
// prepend "data:image/png;base64," if
// `data.data` doesn't already have it
loadImage(data.data, imgResult => {
img = imgResult;
});
});
}
}
综上所述,响应点击加载图像对于大多数应用来说是一种有点奇怪的模式。通常,您希望在 preload
函数中预加载所有资产,以便您可以在请求时立即呈现它们。如果您通过响应事件的 fetch
调用加载,则在呈现之前可能会有 ugly-looking 延迟(或需要显示临时 message/placeholder image/spinner)图片,因此请确保这不是 xy problem.
所以正如标题所说,我正在尝试将 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
可以直接使用Data URLs。它看起来像这样:
function receivedCallback(data) { // This function gets called once we receive the data
// Data looks like this: { width: 100, height: 100, data: "...base64 data...." }
loadImage('data:image/png;base64,' + data.data, function (newImage) {
img = newImage;
});
}
如果出于某种原因需要使用 blob,可以查看 base64 到 blob 的转换,例如 this answer。
史蒂夫完全 工作,我不得不加载图像而不是直接更改它的来源。
所以而不是 img.src = 'data:image/png;base64,' + data.data
.
我需要做 img = loadImage('data:image/png;base64,' + data.data);
感谢史蒂夫的回答!
从 P5.js 中的文件加载 base64 图像和普通图像没有区别。只需用 base64 数据替换 loadImage
调用中的 URL。
为了一个可运行的完整示例(注意 base64 图像非常小):
const imgData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII";
let img;
function preload() {
img = loadImage(imgData);
}
function draw() {
image(img, 0, 0);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.1/p5.min.js"></script>
如果您的数据应该在未来某个不确定的时间点加载,例如,在交互之后,您可以使用回调来确定图像加载的时间。这有点 use-case 具体,但模式可能如下所示:
const imgData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII";
let img;
function setup() {
createCanvas(300, 300);
}
function draw() {
clear();
textSize(14);
text("click to load image", 10, 10);
if (img) {
image(img, 0, 0);
}
}
function mousePressed() {
if (!img) {
loadImage(imgData, imgResult => {
img = imgResult;
});
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.1/p5.min.js"></script>
如果你有一些异步代码,没问题。准备好 base64 字符串后,只需调用 loadImage
,例如:
function mousePressed() {
if (!img) {
fetch("your endpoint")
.then(response => response.json())
.then(data => {
// prepend "data:image/png;base64," if
// `data.data` doesn't already have it
loadImage(data.data, imgResult => {
img = imgResult;
});
});
}
}
综上所述,响应点击加载图像对于大多数应用来说是一种有点奇怪的模式。通常,您希望在 preload
函数中预加载所有资产,以便您可以在请求时立即呈现它们。如果您通过响应事件的 fetch
调用加载,则在呈现之前可能会有 ugly-looking 延迟(或需要显示临时 message/placeholder image/spinner)图片,因此请确保这不是 xy problem.