FabricJS如何判断对象源类型(栅格/矢量)以实现差异化缩放?
判断Fabric.js对象的图像类型(矢量/栅格)并分别处理放大
核心判断逻辑
Fabric.js中不同类型的对象对应矢量或栅格图,你可以通过以下两种方式区分:
1. 通过对象类型判断原生矢量元素
如果对象是Fabric内置的矢量类型(比如路径、基础图形、SVG组),直接放大即可——这类对象本身支持无损缩放:
- 检查对象的
type属性:path、rect、circle、polygon、ellipse、line、group(仅当组内均为矢量元素时)等都属于矢量对象。 image类型则需要进一步判断源格式。
2. 针对fabric.Image对象判断源格式
如果对象是fabric.Image类型,通过其src的格式区分矢量/栅格:
- 检查文件扩展名:判断src是否以
.svg结尾; - 检查Data URI类型:若为base64编码内容,看开头是否包含
data:image/svg+xml。
修改后的代码示例
结合你的现有代码,调整实现判断与分情况处理:
const stringifiedObjectJson = JSON.stringify(obj); fabric.util.enlivenObjects([JSON.parse(stringifiedObjectJson)], function (objects) { objects.forEach(function (o) { o.top -= bound.top; o.left -= bound.left; canvas.add(o); // 判断对象类型并处理放大 let isVector = false; // 情况1:原生矢量对象,直接放大 const vectorTypes = ['path', 'rect', 'circle', 'polygon', 'ellipse', 'line', 'group']; if (vectorTypes.includes(o.type)) { isVector = true; o.scale(2); // 示例:放大2倍 } // 情况2:Image对象,判断源是否为SVG else if (o.type === 'image') { const src = o.getSrc(); if (src.endsWith('.svg') || src.includes('data:image/svg+xml')) { isVector = true; o.scale(2); // SVG矢量图直接放大 } else { // 栅格图,调用超分辨率模型处理 const rasterData = o.toDataURL('image/png'); // 这里接入你的super resolution模型逻辑... } } }); canvas.renderAll(); // 根据类型返回对应结果:矢量图可返回放大后的PNG/SVG,栅格图返回超分辨率处理后的内容 });
注意事项
- 对于
fabric.Group类型,需额外检查组内所有子对象是否均为矢量类型,避免组内混合栅格图的情况; - 若SVG是以Image对象导入(而非直接解析为矢量元素),依然可通过src判断格式并直接放大——SVG本身是矢量格式,放大不会模糊。
内容的提问来源于stack exchange,提问作者Alien13
相关产品推荐
相关产品推荐

