konvajs序列化包含图像的阶段

时间:2017-06-29 22:03:32

标签: konvajs

我正在使用Konvajs创建自定义标签制作工具,一切都运行良好,直到我尝试将舞台序列化为JSON。

用户分三步创建自定义标签。第一步,他们从我们的库中选择一个具有遮罩区域的模板图像。第二步允许他们上传放置在第一步加载的图像后面的个性化图像。有外部控件允许用户缩放和移动图像,以便在蒙版区域中进行渲染。第三步允许他们添加文本。

我希望用户能够将他们的标签保存到他们的库中,以便他们可以再次使用它,但是能够修改这三个步骤中的任何一个。这意味着我需要将舞台序列化为JSON字符串,但图像属性不会保存在JSON中。

JSON字符串: {" ATTRS" {"宽度" 500"高度":667," ID":"标签制造商&# 34;}"的className":"阶段""的子":[{" ATTRS":{},"的className& #34;:"层""的子":的 [{" ATTRS" {"名称":"模板"}"的className":"图像"}] },{" ATTRS":{},"的className&# 34;:"层""的子":[{" ATTRS" {" X":160," Y&# 34;:41.5,"文字":" [在此输入姓名]"," fontSize":30," fontFamily":&# 34;宋体""填充":"#555""名称":" textundefined""对准&# 34;:"中心""可拖动":真," OFFSETX":114.22119140625}"的className":"文本&# 34;}]}]}

我使用Konvajs toJSON()来序列化我的舞台。

function save() {
     var json = stage.toJSON();
     var dataURL = stage.toDataURL('image/png');
     //alert(json);
     $.ajax({
         type: "POST",
         url: "label-maker/image-handler.php?action=save",
         data: {jsonFileText: json, image: dataURL},
         error: function (request, error) {
             console.log(arguments);
             alert(" Can't do because: " + error);
         },
         success: function () {
             alert(" Done ! ");
         }
    });
 }

1 个答案:

答案 0 :(得分:2)

默认情况下,Konva不会将有关图像源的信息保存到JSON。所以你必须手动完成。

创建Konva.Image时,您可以将其来源保存为属性:

// path is url or base64 string from user's input
imageNode.setAttr('src', path);

然后在反序列化时,您可以从源加载图像数据:

const stage = Konva.Node.create(json, 'container');
stage.find('Image').forEach((imageNode) => {
    const src = imageNode.getAttr('src');
    const image = new Image();
    image.onload = () => {
        imageNode.image(image);
        imageNode.getLayer().batchDraw();
    }
    image.src = src;
});