Я пытаюсь реализовать поведение, с помощью которого я могу добавить исходное изображение к холсту (заполнитель), а затем впоследствии я могу выбрать другое изображение для замены этого изображения - это новое изображение должно затем масштабироваться до «соответствия»«в рамках старого образа.Например, если я выбираю портретное изображение в качестве «заполнителя», а затем выбираю ландшафтное изображение для его замены, я ожидаю, что ландшафтное изображение сначала масштабирует свою ширину и поддерживает соотношение сторон, а затем выравнивается по вертикали в пределах границ заполнителя..
Вот jsfiddle того, что я до сих пор работал: https://jsfiddle.net/cgallagher/co8dg527/1/
и вот код:
var canvas = new fabric.Canvas('stage');
var cw = canvas.getWidth()
var ch = canvas.getHeight()
var _currentImage;
function setProductImage(url){
var oldWidth;
var oldHeight;
var oldLeft;
var oldTop;
fabric.Image.fromURL(url, function(img) {
if (_currentImage) {
oldWidth = _currentImage.getScaledWidth()
oldHeight = _currentImage.getScaledHeight()
oldLeft = _currentImage.left
oldTop = _currentImage.top
canvas.remove(_currentImage);
}
_currentImage = img;
img.set({ 'left': oldLeft || 0 })
img.set({ 'top': oldTop || 0 })
if (oldHeight && oldHeight > img.getScaledHeight()){
img.scaleToWidth(oldWidth);
img.set({'height': oldHeight })
} else if (oldWidth > img.getScaledWidth()){
img.scaleToHeight(oldHeight);
img.set({'width': oldWidth })
}
img.selectable = true
canvas.add(img).setActiveObject(img);
});
}
function addImage(url){
setProductImage(url)
canvas.renderAll()
}
Вы можете видеть, что изображение делаетмасштабировать так, как мне хотелось бы, но затем он не выравнивается сам по себе.
Я тоже думаю о том, что мне придется добавить ограничивающий прямоугольник вокруг изображения и, возможно, попытаться выровнять и масштабировать его, но я 'я не уверен, что это возможно даже с тканью?