无法使用 fabric.js 动态更改图像
Unable to change image dynamically using fabric.js
我使用 fabric.js 在 canvas 上放置了 3(最多 5)张图片,现在我正在尝试用 包含新图片网址的数组替换这些图片。最后我正在生成图像输出,但由于图像是异步加载的,因此它们不会在输出(图像)中呈现。我已经寻找了很多解决方案,但没有任何效果
这是我正在使用的代码:
var canvas_virtual = new fabric.Canvas('virtual_canvas');
function GetOutput(){
var exist_objects = canvas.getObjects();
for (var k = 0; k < exist_objects.length; k++) {
var obj = fabric.util.object.clone(exist_objects[k]);
if(obj.name.indexOf("img_icon") > -1){
fnAddImageSave(obj.top,obj.left,obj.id,obj.propertyname,obj.tempPreviewData,obj.nutrientId,listIcons[k],canvas_virtual,obj.height);
}
}
canvas_virtual.renderAll();
console.log(canvas_virtual.toDataURLWithMultiplier("image/jpeg", 1));
}
fnAddImageSave 的定义:
function fnAddImageSave(top, left, image_id, property_name, previewData, nutrientValue, url,canvasObj,height)
{
var img = new Image(); //Equivalent: $(document.createElement('img'))
var URL = url;
//$('#add').append(img);
var name = image_id;
fabric.Image.fromURL(URL, function (oImg) {
//oImg.set('left', PosX).set('top',PosY);
oImg.height = height;
canvasObj.add(oImg);
canvasObj.renderAll();
}, {
"id": name,
"name": name,
"left": left,
"top": top,
"scaleX": .5,
"scaleY": .5,
"cornerSize": 5,
"propertyname": property_name,
"tempPreviewData": previewData,
"nutrientId": nutrientValue
});
}
我将图像从服务器带到 HTML,然后我使用这些图像使用 fabricjs 将它们添加到 canvas。它没有任何问题。下面是我使用的代码:
imgElement = $("#add img[src$='/" + imgElement.defaultIcon.replace('\', '/') + "']");
$(imgElement[0]).attr('height', obj.height * obj.scaleY);
var imgInstance = new fabric.Image(imgElement[0], {
"id": obj.id,
"name": obj.name,
"left": obj.left,
"top": obj.top,
"cornerSize": 5,
"propertyname": obj.propertyname,
"tempPreviewData": obj.tempPreviewData,
"nutrientId": obj.nutrientId
});
canvas_virtual.add(imgInstance);
canvas_virtual.renderAll();
我使用 fabric.js 在 canvas 上放置了 3(最多 5)张图片,现在我正在尝试用 包含新图片网址的数组替换这些图片。最后我正在生成图像输出,但由于图像是异步加载的,因此它们不会在输出(图像)中呈现。我已经寻找了很多解决方案,但没有任何效果
这是我正在使用的代码:
var canvas_virtual = new fabric.Canvas('virtual_canvas');
function GetOutput(){
var exist_objects = canvas.getObjects();
for (var k = 0; k < exist_objects.length; k++) {
var obj = fabric.util.object.clone(exist_objects[k]);
if(obj.name.indexOf("img_icon") > -1){
fnAddImageSave(obj.top,obj.left,obj.id,obj.propertyname,obj.tempPreviewData,obj.nutrientId,listIcons[k],canvas_virtual,obj.height);
}
}
canvas_virtual.renderAll();
console.log(canvas_virtual.toDataURLWithMultiplier("image/jpeg", 1));
}
fnAddImageSave 的定义:
function fnAddImageSave(top, left, image_id, property_name, previewData, nutrientValue, url,canvasObj,height)
{
var img = new Image(); //Equivalent: $(document.createElement('img'))
var URL = url;
//$('#add').append(img);
var name = image_id;
fabric.Image.fromURL(URL, function (oImg) {
//oImg.set('left', PosX).set('top',PosY);
oImg.height = height;
canvasObj.add(oImg);
canvasObj.renderAll();
}, {
"id": name,
"name": name,
"left": left,
"top": top,
"scaleX": .5,
"scaleY": .5,
"cornerSize": 5,
"propertyname": property_name,
"tempPreviewData": previewData,
"nutrientId": nutrientValue
});
}
我将图像从服务器带到 HTML,然后我使用这些图像使用 fabricjs 将它们添加到 canvas。它没有任何问题。下面是我使用的代码:
imgElement = $("#add img[src$='/" + imgElement.defaultIcon.replace('\', '/') + "']");
$(imgElement[0]).attr('height', obj.height * obj.scaleY);
var imgInstance = new fabric.Image(imgElement[0], {
"id": obj.id,
"name": obj.name,
"left": obj.left,
"top": obj.top,
"cornerSize": 5,
"propertyname": obj.propertyname,
"tempPreviewData": obj.tempPreviewData,
"nutrientId": obj.nutrientId
});
canvas_virtual.add(imgInstance);
canvas_virtual.renderAll();