gpt4 book ai didi

javascript - 替换图像时缩放图像以适合

转载 作者:行者123 更新时间:2023-12-01 01:37:38 25 4
gpt4 key购买 nike

我正在尝试实现一种行为,通过该行为我可以将初始图像添加到 Canvas (占位符),然后我可以选择不同的图像来替换该图像 - 然后该新图像应该缩放自身以“适合” “在旧图像的范围内。例如,如果我选择肖像图像作为“占位符”,然后选择风景图像来替换它,我希望风景图像首先缩放其宽度并保持纵横比,然后在占位符尺寸的边界内垂直对齐.

这是我迄今为止所做的工作的一个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()
}

您可以看到图像确实按照我想要的方式缩放,但它不会自行对齐。

我正在考虑在图像周围放置一个边界框,并可能尝试在其中对齐和缩放,但我不确定这对于织物是否可能?

最佳答案

这就是我所做的。当您运行 scaleToWidthscaleToHeight 时,scaleXscaleY 正在发生变化,您需要调整 oldHeight oldWidth 为新的 img.scaleX/img.scalaY我还重写了 Fabric.Image.prototype 中的 _renderFill 方法来创建偏移效果。检查这里:https://jsfiddle.net/mariusturcu93/co8dg527/37/

代码

<html>
<head>
<title>Fabric kicking</title>


<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.0/fabric.js"></script>
<style>
#stage {
border: solid 1px #333;
}
</style>
</head>
<body>
<button onclick="addImage('https://s.hs-data.com/bilder/spieler/gross/208995.jpg')">Add image</button>
<button onclick="addImage('https://cdn.images.express.co.uk/img/dynamic/67/590x/Mateusz-Klich-883903.jpg')">add another image</button>
<canvas id="stage" width="600" height="600"></canvas>

<script>

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/img.scaleX})
} else if (oldWidth > img.getScaledWidth()){

img.scaleToHeight(oldHeight);
img.set({'width': oldWidth/img.scaleY })
}

img.selectable = true
canvas.add(img).setActiveObject(img);
});
}

function addImage(url){
setProductImage(url)
canvas.renderAll()
}
</script>
<img src="https://s.hs-data.com/bilder/spieler/gross/208995.jpg" />
<img src="https://cdn.images.express.co.uk/img/dynamic/67/590x/Mateusz-Klich-883903.jpg" />
</body>
</html>

fabric.Image.prototype._renderFill 重写

fabric.Image.prototype._renderFill= (function(renderFill){
return function(ctx) {

var w = this.width, h = this.height, sW = w * this._filterScalingX, sH = h * this._filterScalingY,
x = -w / 2, y = -h / 2, elementToDraw = this._element;

y = y + Math.abs((this._element.height-h)/2);
x = x + Math.abs((this._element.width-w)/2);
elementToDraw && ctx.drawImage(elementToDraw,
this.cropX * this._filterScalingX,
this.cropY * this._filterScalingY,
sW,
sH,
x, y, w, h);
}
})()

关于javascript - 替换图像时缩放图像以适合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52688965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com