【Vue】fabricjs 实现局部截图及el-image-viewer大图预览

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>使用fabric.js裁剪和显示图片</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.5.0/fabric.min.js"></script>

</head>
<body>
    <canvas id="canvas" ></canvas>
    <img id="sourceImage" src="YOUR URL" style="display: none;">

    <script>
        // var canvas = new fabric.Canvas('canvas');
        var canvas = new fabric.StaticCanvas("canvas");
        var sourceImage = document.getElementById('sourceImage');
        //截图位置
        const cropXywh = [821,3799,97,90]
        fabric.Image.fromURL(sourceImage.src, function(img) {
            canvas.add(img);
            var text = new fabric.Text('这里是文本描述', {
                left: 0,
                top: 0,
                fontSize: 16,
                fill: 'red'
            });
            var textWidth = text.width; // 获取文本的宽度
            var textHeight = text.height; // 获取文本的高度
            img.set({
                left: 0,
                top: textHeight,
                width: cropXywh[2],
                height: cropXywh[3],
                cropX: cropXywh[0], // 裁剪区域左上角x坐标
                cropY: cropXywh[1], // 裁剪区域左上角y坐标
                cropWidth: cropXywh[2], // 裁剪区域宽度
                cropHeight: cropXywh[3] // 裁剪区域高度
            });
            
           
            let widths = [cropXywh[2],textWidth];
            let maxWidth = Math.max(...widths);
            let maxHeight = cropXywh[3]+textHeight;
            canvas.setWidth(maxWidth);
            canvas.setHeight(maxHeight);
            canvas.add(text);
            canvas.renderAll(); // 更新Canvas
            //若使用elementui可以显示局部图放大效果
            //let imgData = canvas.toDataURL({ format: "png", quality: 0.8 });
            // imageData.value = [imgData]
            // showImageViewer.value = true
        });
    </script>
</body>
</html>

效果图:

再结合el-image-viewer可以实现大图预览局部图的效果。

html 复制代码
// 图片预览 
      <el-image-viewer
        style="z-index:1500"
        v-if="showImageViewer"
        @close="()=>{showImageViewer = false}"
        :url-list="imageData"
      >
javascript 复制代码
onMounted(() => {
      // 通过遮罩层关闭图片预览
    document.addEventListener('click',function(e){
        if(e.target.className=="el-image-viewer__mask"){
            let close = document.querySelector(".el-image-viewer__close");
            if(close){
              close.click();
              showImageViewer.value = false
            }else{
             close = document.querySelector(".el-icon-circle-close"); 
              if(close){
                close.click();
                showImageViewer.value = false
              }
            }
        }
    });
 });
相关推荐
锋行天下1 小时前
半秒开!还有谁!!!
前端·vue.js·架构
代码搬运媛2 小时前
git 下中文文件名乱码问题解决
前端
CaffeinePro2 小时前
告别知识点零散!React零基础通关,从环境搭建到Ant Design页面实战
前端·react.js
cidy_982 小时前
水龙头领不到测试币?手把手用 Hardhat 本地环境零门槛学以太坊交易
前端
因_崔斯汀2 小时前
Three.js 3D 地图特效与材质实现指南
前端
angerdream2 小时前
手把手编写儿童手机远程监控App之vue3用 AI Agent生成菜单
前端
cidy_982 小时前
Git Pull 代码冲突后完整回退教程
前端
JING小白2 小时前
Day 1 重学Vue:响应式系统的“底层逻辑”变更,Vue2旧时代的终结与Vue3新时代的开启
前端·vue.js
张就是我1065922 小时前
一个 ZIP 文件,把 webshell 写到了不该在的地方
前端
张就是我1065922 小时前
SPIP 的一个漏洞:你以为过滤了,其实没过滤干净
前端