Укладка изображений в Fabric.js

#javascript #canvas #html5-canvas #fabricjs

#javascript #холст #html5-canvas #fabricjs

Вопрос:

Я пытаюсь наложить другое изображение (SVG) поверх загруженного пользователем изображения (например, JPEG) с Fabric.js . Я просто не могу заставить изображение SVG отображаться.

Это то, что у меня есть в:

HTML

 <canvas id="canvas" width="128" height="128"></canvas>
<input type="file" id="upload">
  

JS

 var svg = 'data:image/svg xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="480pt" id="logo" preserveAspectRatio="xMidYMid meet" viewBox="0 0 480 480" width="480pt">...</svg>';

var canvas = new fabric.StaticCanvas('canvas');

document.getElementById('upload').addEventListener("change", function (e) {

  var file = e.target.files[0];
  var reader = new FileReader();

  reader.onload = function (f) {
    canvas.clear();
    var data = f.target.result;
  
    // Image
    fabric.Image.fromURL(data, function (img) {
      var oImg = img.set({
        left: 0,
        top: 0
      });
      if (oImg.width > oImg.height) {
        oImg.scaleToHeight(128);
      } else {
        oImg.scaleToWidth(128);
      }
      canvas.add(oImg).centerObject(oImg).renderAll();
    });

    // Logo
    fabric.Image.fromURL(svg, function(img) {
      var logo = img.set({
        width: 48,
        height: 48,
        bottom: 8,
        right: 8,
        opacity: 1
      });
      canvas.add(logo).renderAll();
    });

    var dataURL = canvas.toDataURL({format: 'png', quality: 0.8});
  };
  reader.readAsDataURL(file);
});
  

Загруженные пользователем изображения отображаются нормально, но не тот SVG, который я пытаюсь разместить сверху.

Ответ №1:

Я думаю, что все, чего вам не хватало, это закодировать svg, смотрите Пример ниже:

 function svgimage() {
  var image = `<svg xmlns="http://www.w3.org/2000/svg" width="220" height="200" version="1.1"><defs><radialGradient id="grey_blue" cx="50%" cy="50%" r="50%" fx="20%" fy="40%"><stop offset="0%" style="stop-color:gray;stop-opacity:0"/><stop offset="100%" style="stop-color:blue;stop-opacity:1"/></radialGradient></defs><ellipse cx="110" cy="100" rx="110" ry="100" style="fill:url(#grey_blue)"/></svg>`;
  return encodeURIComponent(image);
}

var canvas = new fabric.StaticCanvas('canvas');

document.getElementById('upload').addEventListener("change", function(e) {
  var file = e.target.files[0];
  var reader = new FileReader();

  reader.onload = function(f) {
    canvas.clear();
    var data = f.target.result;

    // Image
    fabric.Image.fromURL(data, function(img) {
      var oImg = img.set({left: 0, top: 0});
      if (oImg.width > oImg.height) {
        oImg.scaleToHeight(128);
      } else {
        oImg.scaleToWidth(128);
      }
      canvas.add(oImg).centerObject(oImg).renderAll();
    });

    // Logo
    fabric.Image.fromURL('data:image/svg xml;charset=utf-8,'   svgimage(), function(img) {
      var logo = img.set({width: 148, height: 148, bottom: 8, right: 8, opacity: 1});
      canvas.add(logo).renderAll();
    });

    var dataURL = canvas.toDataURL({format: 'png', quality: 0.8});
  };
  reader.readAsDataURL(file);
});  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.6.2/fabric.min.js"></script>

<input type="file" id="upload"><br>
<canvas id="canvas" width="200" height="200"></canvas>