vue中fabric的使用(图片标注、画框画箭头文字涂鸦等...)

本文介绍了如何使用fabric.js插件实现类似微信截图后的图片标注功能,并详细记录了解决画布大小调整导致的图片空白和屏幕分辨率影响标注精度的问题,包括代码示例和配置参数调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继上一篇使用tui-image-editor 图片编辑 标注图片 这个需求上线后 客户觉得用着不顺手 还是想找一个 类似微信截图后标注图片的功能

网上参考很多方法 大致方向是使用fabric这个插件 实现我的产品需求 找了很多 有的要不是图片尺寸不符合规则 要不就是拖动效果做的不够流畅 就也挺坑的 不过皇天不负有心人 还是找到一篇坑少 并且比较符合需求的一款 放在这里给大家参考

https://www.cnblogs.com/xc-dh/p/17218382.html

大概克隆下来 npm i 安装插件 再把项目跑起来后 这个图片标注的功能差不多可以使用了 

下面记录 我遇到的一些问题

一、由于画布是固定的大小 当图片在呈现在画布上 图片大多数是不会铺满画布的 因为尺寸不一。所以当对图片进行一系列标注编辑后 下载下来的图片 是画布的原始尺寸 也就是说图片自动会填充空白变成成和画布一样的大小 所以需要做的是 保存图片时去除图片的空白 保留图片的原始尺寸(在上传一步操作里加上代码)

附代码:

function clearblankimg(imgData){
    
        var img = new Image(); //创建图片对象
        img.src = imgData;
        img.onload = function() {
            var c = document.createElement('canvas'); //创建处理画布对象
            var ctx = c.getContext('2d');
            c.width = img.width;
            c.height = img.height;
            ctx.drawImage(img, 0, 0); //绘制
            var imgData = ctx.getImageData(0, 0, c.width, c.height).data; //读取图片数据
            var lOffset = c.width,
                rOffset = 0,
                tOffset = c.height,
                bOffset = 0;
            for (var i = 0; i < c.width; i++) {
                for (var j = 0; j < c.height; j++) {
                    var pos = (i + c.width * j) * 4
                    if (imgData[pos] == 255 || imgData[pos + 1] == 255 || imgData[pos + 2] == 255 || imgData[pos + 3] == 255) {
                        bOffset = Math.max(j, bOffset); // 找到有色彩的最下端
                        rOffset = Math.max(i, rOffset); // 找到有色彩的最右端
                        tOffset = Math.min(j, tOffset); // 找到有色彩的最上端
                        lOffset = Math.min(i, lOffset); // 找到有色彩的最左端
                    }
                }
            }
            lOffset++;
            rOffset++;
            tOffset++;
            bOffset++;
            var x = document.createElement("canvas"); //创建处理后画布对象
            x.width = rOffset - lOffset;
            x.height = bOffset - tOffset;
            var xx = x.getContext("2d");
            xx.drawImage(img, lOffset, tOffset, x.width, x.height, 0, 0, x.width, x.height); //绘制

            console.log(x.toDataURL()); //得到最终裁剪出来的base64

        }

    }

修复前:

修复后:

二、屏幕分辨率引起的选中状态下的框移位。简言说就是浏览器窗口缩放后 标注图片时鼠标和标注元素位置对不上

这是因为enableRetinaScaling属性导致的

这里设置为false 这个问题就解决了

可以参考使用Vue + fabric.js构建标注工具的细节-腾讯云开发者社区-腾讯云 的第3个小点 关于这个缩放问题 博主讲述的很仔细 每一步的思路 都很好理解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值