You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fabric.js图片缩放适配模式:避免拉伸且保留控制框调整功能

问题

使用Fabric.js在Canvas中显示图片时,默认调整图片大小会拉伸图片、破坏宽高比,如何配置才能避免拉伸,同时允许调整控制框大小?

原代码示例

JavaScript代码

const canvas = new fabric.Canvas('demo', {
  backgroundColor: '#DDDEEE',
  centeredScaling: true,
  centeredRotation: true
});
const CANVAS_WIDTH = 540;
const CANVAS_HEIGHT = CANVAS_WIDTH;
canvas.setDimensions({ width: CANVAS_WIDTH, height: CANVAS_HEIGHT });


fabric.Image.fromURL('https://via.placeholder.com/300', (img) => {
  canvas.add(img);
});

HTML代码

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.2.4/fabric.min.js"></script>
</head>
<body class="mat-typography">
<canvas id="demo"></canvas>
</body>
</html>

解决方案

Fabric.js内置了lockUniScaling属性,开启后可强制保持元素宽高比,调整控制框大小时图片不会被拉伸,完全匹配你想要的「调整大小并保持比例」的效果。

有两种配置方式:

1. 全局配置(对画布内所有元素生效)

初始化Canvas时添加lockUniScaling: true,所有添加到该画布的元素都会默认保持宽高比:

const canvas = new fabric.Canvas('demo', {
  backgroundColor: '#DDDEEE',
  centeredScaling: true,
  centeredRotation: true,
  lockUniScaling: true // 全局开启比例锁定
});

2. 单独给图片设置(仅对当前图片生效)

如果只需要特定图片保持比例,在图片加载完成后给实例设置属性即可:

fabric.Image.fromURL('https://via.placeholder.com/300', (img) => {
  img.lockUniScaling = true; // 单独锁定该图片的比例
  canvas.add(img);
});

效果说明

开启lockUniScaling后,拖动图片控制框的边角时,图片会按照原始宽高比同步缩放,不会出现拉伸变形;同时控制框的大小依然可以自由调整,满足缩放需求。

内容的提问来源于stack exchange,提问作者Mariano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:25:22