继上一篇使用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个小点 关于这个缩放问题 博主讲述的很仔细 每一步的思路 都很好理解