KonvasJs: высота и ширина изображения теряются при сохранении сцены холста в строку JSON

Я разрешаю пользователю загружать изображение на холст; при создании Konvas.Image я устанавливаю атрибуты высоты и ширины на основе изображений naturalHeight и naturalWidth.

Загрузить код:

function loadImageStep1(src) {        
    var imgKI = new Konva.Image({
        x: 0,
        y: 0,
        name: 'step1-label',
        id: 'step1-label'
    });

    layer1.add(imgKI);
    stage.add(layer1);//Add layer to stage.

    var layer1Img = stage.find('.step1-label');
    var reader = new FileReader();
    reader.onload = function(event) {
        img = new Image();
        img.onload = function() {
            imgKI.image(img);
            layer1.draw();
            layer1Img.setAttr('width', this.naturalWidth);
            layer1Img.setAttr('height', this.naturalHeight);                 
            layer1.draw();
        }
        img.src = event.target.result;//event.target.result
        layer1Img.setAttr('src', event.target.result);        
    }
    reader.readAsDataURL(src);

    return false;
}

Когда я сохраняю холст в строку JSON, высота и ширина изображения исчезают. Я сохранил объект Konva.Image в переменную и добавил в журнал консоли, чтобы убедиться, что атрибуты присутствуют. Снимок экрана журнала консоли

Вот строка JSON, предоставленная функцией stage.toJSON(); обратите внимание, что высота и ширина для объекта изображения "step1-label" отсутствуют.

{ "ATTRS":{"ширина":500,"высота":667,"идентификатор": "ярлык-мейкера", "заполнить":"# ДДД"},"Classname": "Сцена", "дети":[{"ATTRS":{"ID": "фон", "название": "фон"},"имя класса": "Слой", "дети":[{"ATTRS":{"ширина": 500," высота ": 667," заполнить ":" # FFFFFF "}," имя класса ":"Rect"}]},{" ATTRS ": {" ID ":"layer1","имя":"layer1"}," имя класса ":" слой", "дети":[{"ATTRS":{"х":100,"Y":180,"название": "шаг1-метка", "идентификатор": "шаг1-метка","src":"[УДАЛЕНО, ЧТОБЫ СДЕЛАТЬ СТРОКУ МАЛЕНЬКОЙ]","scaleX":"1.72","scaleY":"1.72"},"className":"Image"}]},{"attrs":{"id":"layer3","название":"layer3"},"имя класса": "Слой", "дети":[{"ATTRS":{"ID": "", "название txtGroup1":"txtGroup1","перетаскивание": правда, "х":-5,"у":202},"имя класса": "Группа", "дети":[{"ATTRS":{"х":250,"у":333,5,"text":"Fine Dinning \nSpecial Preserve","fontSize":"50","fontFamily":"Great Vibes","fill":"#000000","name":"text1","id":"текст1", "выравнивание": "центр", "LineHeight":"1","FontStyle":"жирным шрифтом", "OffsetX": +203,81988525390625},"имя класса": "Текст"}]}]}]}

Вот моя работа по этому вопросу. Я должен был получить объекты изображения и добавить высоту и ширину к строке JSON. Это просто, потому что мы разрешаем добавлять на холст только два изображения.

function saveLabel($title, $continue) {
    //Get current width, height and scale settings for the canvas. Use these values to reset once the canvas has beeen saved.
    var currentWidth = stage.width();
    var currentHeight = stage.height();
    var currentXScale = stage.scaleX();
    var currentYScale = stage.scaleY();
    stage.setWidth(width);
    stage.setHeight(height);
    stage.scale({ x: 1, y: 1 });
    stage.draw();
    var $json = stage.toJSON();
    //The Konvas library is dropping the height and width of the images when creating the json string, so we have to put them back in...   
    var layer1Img = stage.find('.step1-label');
    var layer2Img = stage.find('.custom');
    if (layer1Img.length) {
        $json = $json.replace('"id":"step1-label"','"id":"step1-label","height":' + layer1Img[0]["attrs"].height + ',"width":' + layer1Img[0]["attrs"].width);
    }
    if (layer2Img.length) {
        $json = $json.replace('"id":"custom"','"id":"custom","height":' + layer2Img[0]["attrs"].height + ',"width":' + layer2Img[0]["attrs"].width);
    }    
    var $dataURL = stage.toDataURL('image/png');   

    //Set the canvas back to original settings now that it's been saved.
    stage.setWidth(currentWidth);
    stage.setHeight(currentHeight);
    stage.scale({ x: currentXScale, y: currentYScale });
    stage.draw();

    saveLabelAjax($json, $dataURL, $title, $continue, label_maker, window.location.hash);
}

Есть ли что-то, что мне не хватает в моем коде; я правильно устанавливаю атрибуты изображения?

Мне нужна высота и ширина изображения для функции вращения, и когда я загружаю холст из JSON, функции вращения не работают правильно из-за этих отсутствующих данных.

1 ответ

Я нашел, почему у вас нет width а также height в формате JSON.

Преобразовывая Konva.Node JSON Конва пытается сделать его как можно более минимальным. Например, он сохраняет значения по умолчанию (для x и y in будет 0).

В твоем случае width атрибут Konva.Image равна естественной ширине исходного изображения, которое вы используете. Так что это бесполезно в JSON.

Когда вы восстанавливаете сцену из JSON, вам нужно просто загрузить собственные изображения и установить их в Konva.Image экземпляров.

Другие вопросы по тегам