【问题标题】:Keep Added Image Behind Image while Moving移动时将添加的图像保留在图像后面
【发布时间】:2018-02-21 06:24:24
【问题描述】:

我正在使用带有可切换背景的 fabricjs 1.7.22,并且能够在所述背景图像后面添加图像。我几乎可以按照我的意愿使用它,但我的问题是当我将从我的计算机上传的图像移动到框架图像后面时,它不会停留在第一个画布中的框架后面。但是,它在静态画布中正常工作。我究竟做错了什么?

我设置了canvas.preserveObjectStacking = true;,所以很困惑。

请在下面查看我的代码 sn-p,选择一张图片,然后从您的计算机上传一张图片以查看复制我的问题。

var canvas = [],
  image;
canvas.push(new fabric.Canvas('c0'));
for (i = 1; i <= 7; i++) {
  canvas.push(new fabric.StaticCanvas('sc' + i));
}

canvas.preserveObjectStacking = true;

function dropText() {
  var text = new fabric.IText('Type here...', {
    fontSize: 27,
    top: 10,
    left: 10,
  });
  canvas[0].add(text);
}

canvas[0].on('object:added', onModified);
canvas[0].on('object:modified', onModified);
canvas[0].on('object:scaling', onModified);
canvas[0].on('object:moving', onModified);

function onModified(option) {
  var ob = option.target;
  var index = canvas[0].getObjects().indexOf(ob);
  ob.clone(function(obj) {
    for (i = 1; i <= 7; i++) {
      canvas[i].insertAt(obj, index, true);
    }
  });
};


// New Photo to Canvas
document.getElementById('addimg').onchange = function handleImage(e) {
  var reader = new FileReader();
  reader.onload = function (event) {
    var imgObj = new Image();
    imgObj.src = event.target.result;
    imgObj.onload = function () {
      var image = new fabric.Image(imgObj);
      image.set({
        left: 10,
        top: 10,
      }).scaleToHeight(100);
      canvas[0].add(image);
      canvas[0].sendToBack(image);
      updateCanvas();
    };
  };
  reader.readAsDataURL(e.target.files[0]);
};

$('#update').click(function() {
  updateCanvas();
});

function updateCanvas() {
  var json = JSON.stringify(canvas[0]);
  for (i = 1; i <= 7; i++) {
    canvas[i].loadFromJSON(json);
  }
}
// Toggling Images
function replaceImage(imgUrl) {
  if (!isImageLoaded) return; //return if initial image not loaded
  image.setSrc(imgUrl, function() {
    canvas[0].renderAll();
    updateCanvas();
  });
}

// Default (Blank)
fabric.Image.fromURL('https://i.imgur.com/SamdNdX.png', function(img) {
  isImageLoaded = true;
  image = img.set({
    selectable: false,
    evented: false,
  }).scale(0.5);
  canvas[0].add(image);
  canvas[0].sendToBack(image);
  updateCanvas();
});

$('#save').click(function() {
  html2canvas($('#imagesave'), {
    onrendered: function(canvas) {
      var a = document.createElement('a');
      // toDataURL defaults to png, so we need to request a jpeg, then convert for file download.
      a.href = canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream");
      a.download = 'myfile.jpg';
      a.click();
    }
  });
});
body {
  margin: 0px;
  padding: 0px;
}

canvas {
  border: 1px solid #f00;
  margin: 0px;
  display: block;
}

td {
  margin: 0;
  padding: 0;
  border: 0;
  outline: 0;
  vertical-align: baseline;
}

#addimg {
	position: relative;
	overflow: hidden;
	cursor: pointer;
}

input {
	position: absolute;
	font-size: 50px;
	opacity: 0;
	right: 0;
	top: 0;
	cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.js"></script>

<button onclick="dropText();" class="dropdown-item">Add Text</button>

<a id="addimg" class="dropdown-item">
                <input type="file" name="file" />Add Image</a>

<button id="save">Save</button>
<button onclick="replaceImage('https://i.imgur.com/SamdNdX.png')">Blank</button>
<button onclick="replaceImage('https://i.imgur.com/RuZ5HTH.png')">Image A Pic</button>
<button onclick="replaceImage('https://i.imgur.com/u3Knj4R.png')">Image B Pic</button>

<div id="imagesave">

  <table>
    <tr>
      <td>
        <canvas id="c0" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc1" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc2" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc3" width="187.5" height="318.75"></canvas>
      </td>
    </tr>
    <tr>
      <td>
        <canvas id="sc4" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc5" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc6" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc7" width="187.5" height="318.75"></canvas>
      </td>
    </tr>
  </table>

</div>

【问题讨论】:

  • 只有当它处于活动状态时它才会被带到前面,但是如果你点击远离图像,图像会后退。
  • 没错。我不希望它被带到前面(留在图像后面)
  • 但是如果图像隐藏在后面,你怎么看呢?您的意思是您只想在移动时查看对象范围?
  • 就是我的意思,你只需要看到透明的中心
  • 检查我的答案,现在它正在工作。

标签: fabricjs


【解决方案1】:

您需要将preserveObjectStacking:true 添加到每个画布,因为您将preserveObjectStacking:true 实现到数组而不是画布。

var canvas = [],
  image;

canvas.push(new fabric.Canvas('c0',{preserveObjectStacking:true}));
for (i = 1; i <= 7; i++) {
  canvas.push(new fabric.StaticCanvas('sc' + i,{preserveObjectStacking:true}));
}

canvas.preserveObjectStacking = true;

function dropText() {
  var text = new fabric.IText('Type here...', {
    fontSize: 27,
    top: 10,
    left: 10,
  });
  canvas[0].add(text);
}

canvas[0].on('object:added', onModified);
canvas[0].on('object:modified', onModified);
canvas[0].on('object:scaling', onModified);
canvas[0].on('object:moving', onModified);

function onModified(option) {
  var ob = option.target;
  var index = canvas[0].getObjects().indexOf(ob);
  ob.clone(function(obj) {
    for (i = 1; i <= 7; i++) {
      canvas[i].insertAt(obj, index, true);
    }
  });
};


// New Photo to Canvas
document.getElementById('addimg').onchange = function handleImage(e) {
  var reader = new FileReader();
  reader.onload = function (event) {
    var imgObj = new Image();
    imgObj.src = event.target.result;
    imgObj.onload = function () {
      var image = new fabric.Image(imgObj);
      image.set({
        left: 10,
        top: 10,
      }).scaleToHeight(100);
      canvas[0].add(image);
      canvas[0].sendToBack(image);
      updateCanvas();
    };
  };
  reader.readAsDataURL(e.target.files[0]);
};

$('#update').click(function() {
  updateCanvas();
});

function updateCanvas() {
  var json = JSON.stringify(canvas[0]);
  for (i = 1; i <= 7; i++) {
    canvas[i].loadFromJSON(json);
  }
}
// Toggling Images
function replaceImage(imgUrl) {
  if (!isImageLoaded) return; //return if initial image not loaded
  image.setSrc(imgUrl, function() {
    canvas[0].renderAll();
    updateCanvas();
  });
}

// Default (Blank)
fabric.Image.fromURL('https://i.imgur.com/SamdNdX.png', function(img) {
  isImageLoaded = true;
  image = img.set({
    selectable: false,
    evented: false,
  }).scale(0.5);
  canvas[0].add(image);
  canvas[0].sendToBack(image);
  updateCanvas();
});

$('#save').click(function() {
  html2canvas($('#imagesave'), {
    onrendered: function(canvas) {
      var a = document.createElement('a');
      // toDataURL defaults to png, so we need to request a jpeg, then convert for file download.
      a.href = canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream");
      a.download = 'myfile.jpg';
      a.click();
    }
  });
});
body {
  margin: 0px;
  padding: 0px;
}

canvas {
  border: 1px solid #f00;
  margin: 0px;
  display: block;
}

td {
  margin: 0;
  padding: 0;
  border: 0;
  outline: 0;
  vertical-align: baseline;
}

#addimg {
	position: relative;
	overflow: hidden;
	cursor: pointer;
}

input {
	position: absolute;
	font-size: 50px;
	opacity: 0;
	right: 0;
	top: 0;
	cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.js"></script>

<button onclick="dropText();" class="dropdown-item">Add Text</button>

<a id="addimg" class="dropdown-item">
                <input type="file" name="file" />Add Image</a>

<button id="save">Save</button>
<button onclick="replaceImage('https://i.imgur.com/SamdNdX.png')">Blank</button>
<button onclick="replaceImage('https://i.imgur.com/RuZ5HTH.png')">Image A Pic</button>
<button onclick="replaceImage('https://i.imgur.com/u3Knj4R.png')">Image B Pic</button>

<div id="imagesave">

  <table>
    <tr>
      <td>
        <canvas id="c0" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc1" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc2" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc3" width="187.5" height="318.75"></canvas>
      </td>
    </tr>
    <tr>
      <td>
        <canvas id="sc4" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc5" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc6" width="187.5" height="318.75"></canvas>
      </td>
      <td>
        <canvas id="sc7" width="187.5" height="318.75"></canvas>
      </td>
    </tr>
  </table>

</div>

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2012-01-11
    • 2016-09-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多