Разница между NodeJS Fabric и визуализацией холста браузера

#javascript #node.js #canvas #fabricjs

#javascript #node.js #холст #fabricjs

Вопрос:

Я использую точно такой же код javascript для NodeJS и HTML-файла с Javascript, который вы можете увидеть здесь https://jsfiddle.net/4th8poa9 /

 fabric.Object.prototype.set({
    cornerSize: 22,
    borderColor: 'rgba(205,205,205,0.5)',
    centeredRotation: true,
    centeredScaling: true,
    rotatingPointOffset: 0,
});
fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center';
fabric.Object.prototype.transparentCorners = false;

var canvas = new fabric.Canvas('stage', {
    width: 1288,
    height: 1288,
    preserveObjectStacking: true,
    controlsAboveOverlay: true,
    enableRetinaScaling: false,
});

var data = {
    "stages": {
        "SP": {
            "data": {
                "objects": [{
                    "type": "i-text",
                    "originX": "center",
                    "originY": "center",
                    "left": 331.3,
                    "top": 126.2,
                    "width": 131.37,
                    "height": 33.9,
                    "fill": "#FFFFFF",
                    "visible": true,
                    "text": "Text Layer",
                    "fontSize": "30",
                    "fontWeight": "normal",
                    "fontFamily": "Nerko One",
                    "fontStyle": "",
                    "lineHeight": 1.16,
                    "evented": true,
                   "name": "Text Layer",
                   "styles": {}
                }],
                "limit_zone": {
                    "width": 191,
                    "height": 254,
                    "top": 109,
                    "left": 260
                },
                "product_width": 437,
                "product_height": 437
            },
        }
    },
}

var j = 1288;
var pw = 1288

var editing = {
    width: 564,
    height: 751,
    top: 53,
    left: 12
 };

var limit_zone = {}

fabric.util.loadImage('https://core.simpleprint.com/cdn/xx/gildan_64000_black.jpg', function (a) {
    var i = new fabric.Image(a);

    i.set({
        left: canvas.width / 2,
        top: (canvas.height) / 2,
        width: 1288,
        height: 1288,
        selectable: false,
        evented: false,
    });

    limit_zone = new fabric.Rect({
        fill: 'transparent',
        left: ((canvas.width / 2)   editing.left) - (editing.width / 2),
        top: (((j / 2)   editing.top) - (editing.height / 2)),
        height: editing.height,
        width: editing.width,
        originX: 'left',
        originY: 'top',
        stroke: '#ffffff',
        strokeDashArray: [5, 5],
        selectable: false,
        evented: false,
        visible: true,
        radius: 0,
        rx: 0,
        ry: 0,
    });

    canvas.add(i, limit_zone)

    let xCenter = data.stages.SP.data.limit_zone !== undefined ? data.stages.SP.data.limit_zone.left   (data.stages.SP.data.limit_zone.width / 2) : 0,
        yCenter = data.stages.SP.data.limit_zone !== undefined ? data.stages.SP.data.limit_zone.top   (data.stages.SP.data.limit_zone.height / 2) : 0;
    xCenter = xCenter !== 0 ? (limit_zone.left   (limit_zone.width / 2)) - xCenter : 0;
    yCenter = yCenter !== 0 ? (limit_zone.top   (limit_zone.height / 2)) - yCenter : 0;

    var scale = (data.stages.SP.data.product_height ? 1288 / data.stages.SP.data.product_height : 1);

    var o = extend({
        stroke: '',
        strokeWidth: 0,
        scaleX: 1,
        scaleY: 1,
        angle: 0,
        skewX: 0,
        skewY: 0,
        left: limit_zone.left   (limit_zone.width / 2),
        top: limit_zone.top   (limit_zone.height / 2)
    }, data.stages.SP.data.objects[0]);

    o.top  = yCenter;
    o.left  = xCenter;

    var d = limit_zone,
        _ops = extend({
            left: d.left   (d.width / 2),
            top: d.top   (d.height / 2),
            name: o.text ? o.text : 'Sample Text'
        }, o)


    var object = new fabric.IText(o.text ? o.text : 'Sample Text', _ops);

    canvas.add(object);

    if (scale !== 1) {
        objs = canvas.getObjects().filter(function (o) {
            if (o.evented === true) {
                o.set('active', true);
                return true
            } else return false
        });

        if (objs.length === 0) {
            return false
        };
        var d = new fabric.Group(objs, {
            scaleX: scale,
            scaleY: scale,
            originX: 'center',
            originY: 'center'
        });


        var e = (limit_zone.width / 2)   limit_zone.left,
            yl = (limit_zone.height / 2)   limit_zone.top;


        d.set({
            left: e - ((e - d.left) * scale),
            top: yl - ((yl - d.top) * scale)
        })


        canvas._activeObject = null;

        d.setCoords()

        canvas.renderAll()
    }
}, null, {
    crossOrigin: 'Anonymous'
})


function extend() {
    for (var i = 1; i < arguments.length; i  )
        for (var key in arguments[i])
            if (arguments[i].hasOwnProperty(key))
                arguments[0][key] = arguments[i][key];
    return arguments[0];
}
 

В структуре браузера холст отображается так, как и должно быть, но в NodeJS есть проблема: текстовый объект, похоже, имеет гораздо больший интервал между символами. Я прикрепляю изображение, как оно выглядит в NodeJSвведите описание изображения здесь

Я использую некоторые вычисления для изменения размера объектов

Я думаю, что проблема в этом фрагменте кода

 var d = new fabric.Group(objs, {
        scaleX: scale,
        scaleY: scale,
        originX: 'center',
        originY: 'center'
    });
 

Он масштабирует ширину и высоту объекта, но также масштабирует интервал между символами. Как предотвратить это, как сохранить интервал между символами по умолчанию?