首页 > 其他分享 >fabric image 替换图片

fabric image 替换图片

时间:2022-09-22 15:26:17浏览次数:57  
标签:canvas fabric url image let 上传 替换

在之前的基础上调整部分代码,实现上传图片后的替换图片,及可以直接上传替换图片

首先需要上传一张图片,后续操作的前提都需要 canvas 中有选中的 image 对象:

 

之后可以点击【直接替换】,内置了2中方式:一种直接 url (需要实际存在资源文件);另一种则为 dataUrl(base64...):

 

第二种就是再次点击上传【选择文件】,正常画布内无选中元素时,会将上传文件添加到 画布中去;而有选中元素,则会替换选中图片的内容

 

代码记录:

import { fabric } from 'fabric';
import { Image } from './image';

/**
 * 上传文件
 * 添加到 canvas 中
 * 增加上传替换(上传时如果有选中图片,则直接替换)
 * 代码直接替换图片(url / dataURL)
 */
export class Upload {
    num = 0;

    constructor(canvas) {
        // 添加 input
        this.addTarget(canvas);

        // 测试替换图片
        this.testChange(canvas);
    }

    /**
     * 添加必要元素
     */
    addTarget(canvas) {
        let ele = `
            <div class="warp">
                <div class="warp-content">点击上传</div>
                <input type="file" id="file"/>
            </div>
            <img src="" alt="" class="img" />
        `;
        $('body').append(ele);
        let _self = this; // 保存当前对象引用
        let file = document.getElementById('file');
        let image = document.getElementsByClassName('img')[0];
        file.onchange = function () {
            // 获取到一个FileList对象中的第一个文件( File 对象),是我们上传的文件
            let fileData = this.files[0];
            let pettern = /^image/;

            console.info(fileData.type)

            if (!pettern.test(fileData.type)) {
                alert("图片格式不正确");
                return;
            }
            let reader = new FileReader();
            // 异步读取文件内容,结果用data:url的字符串形式表示
            reader.readAsDataURL(fileData);
            /*当读取操作成功完成时调用*/
            reader.onload = function (e) {
                console.log(e); //查看对象
                // 要的数据 这里的this指向FileReader()对象的实例reader
                console.log(this.result);
                image.setAttribute("src", this.result);
                // 调用绘图
                // 先调用替换,如果存在选中对象,则执行图片替换;无则返回 false
                let hasActive = _self.doExchange(canvas, this.result);
                if (hasActive === false) {
                    // 界面没有选中,则执行添加图片操作
                    _self.addToCanvasByUrl(canvas, this.result);
                }
            }
        }
    }


    /**
     * 第一种方法,url
     * 异步加载性能最好
     * url 可以是下载 url, 也可以是 dataUrl (data:image/jpg;base64,...)
     */
    addToCanvasByUrl(canvas, data) {
        new fabric.Image.fromURL(data, (img) => {
            img.set(Image.defaultImage(canvas, img));
            canvas.add(img);
            img.center();
            img.sendBackwards();
        });
    }

    /**
     * 测试替换图片(确保有选中的图片再进行替换!)
     */
    testChange(canvas) {
        $('body').append(`<button class="exchange">直接替换</button>`);
        $('.exchange').on('click', (e) => {
            let urls = [
                'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAABHNCSVQICAgIfAhkiAAAAaBJREFUSIntlEFSIkEQRV92t6G76bkB3oAbyA1kixMT00q7Bk5AegKcPQZOEDTLCW+AN+AGtjdgawR0ugAUsJASXfpXVfGz8v/Mqkr4xgcgq5tUsw7Q/KLc1109awFEG0QTuIbZ3efyh6eLXE4RYHbX1d+jz0ik2gfCl444RHYj0WEpwhq+hoJ9RCJmVaAJYccvfh9I+AMzDGJYVCb8mRr/brWWf43IBg6wjhnVaC7a2uS923WhgyTVfsXFLSsyJHbxXpVc6qBsSA+CSaK9Y19jXiJ1zaoznkZGEUMISAxHTrfvYWu70qthW+B/yJHXC9pLpLDiEUCwyZQoB5sY5Lday5ccyGgRPgYwivudiqlmtnq5lzooL9eJ9tbalOiwtL5/5VPtV1LNbLlfG5B1zR4CGJvIeKejdyBmZcMqXf31EzYuXuAvcIJZxXXYFwYYcr6SdzcS7cURh23XP7jR2rnrzCo8RYalCHtwcVPk2DVKvETqmlUNiwECLIZgy1MuWgUymccVuWsqb/2MAg2QEoDNvWxxGzRenYY58EbkGx/CMx2qj7Qd6S9UAAAAAElFTkSuQmCC',
                './assets/111.png'
            ];
            this.num++;
            this.doExchange(canvas, urls[this.num % 2]);
        });
    }

    /**
     * 执行图片替换操作
     * @param canvas
     * @param url
     * @return boolean 如果没有激活元素,不会进行替换操作并返回 false 标记;
     */
    doExchange(canvas, url) {
        let activeObj = canvas.getActiveObject();
        console.log(activeObj);
        if (!activeObj) {
            return false;
        }
        activeObj.setSrc(url, () => {
            canvas.renderAll();
        });
    }
}

 

标签:canvas,fabric,url,image,let,上传,替换
From: https://www.cnblogs.com/guofan/p/16719411.html

相关文章

  • 计算机系统结构大题精讲2-LRU替换算法
    LRU近期最少使用算法1、考虑一个920字的程序,其访问虚存的地址流为:23、216、156、618、382、490、492、868、916、728。若页面大小为200字,主存容量为600字,采用LRU算法。请......
  • 用羽毛替换 CSV
    用羽毛替换CSV一个逗号分隔值(CSV)文件是分隔的文本文件使用一个逗号分隔值。文件的每一行都是一个数据记录.每条记录由一个或多个字段,被逗号隔开。在数......
  • secure boot (一)fit image
    前言secureboot和FITImage是前段时间接触到的,其实早就该总结下了,奈何懒癌犯了,拖了好久才写出来。之前也有人问我,工作后最大的感受是什么?我的回答是:“快速学习”。就......
  • 运行 docker run hello-world 报错 Unable to find image ‘hello-world:latest‘ loc
    原文链接:https://blog.csdn.net/weixin_43520450/article/details/107377342报错提示如下:解决办法:1、执行以下命令vi/etc/docker/daemon.json2、添加以下的内容并保......
  • notepad++ 替换常用方法(正则表达式)
    Ctrl+H打开替换:行首空格和空行去除:"^\s+"->""行首插入ABCD:"^"->"ABCD"行尾空格和空行去除:"\s+$"->""行尾插入ABCD:"$"->"ABCD"按头AB,尾CD去除内容(单行非......
  • QPixmap::fromImage(img)访问冲突
     我是在将图像格式转换为QImage后,把QImage发送给UI界面显示时出现的问题。 加了个深拷贝,就解决了。OutImage=QImage(buffer,width,height,QImage::Format_RGB88......
  • 前端怎么对一张图片特定某些点进行点击事件(image-map)
    图片热区技术插入一张图片,并设置好图像的有关参数,在<img>标记中设置参数usemap="#image-map",以表示对图像地图的引用。用<map>标记设定图像地图的作用区域,并取名:image-ma......
  • Java:word替换关键词和转pdf
    最近有个word替换关键词和转为pdf的需求,网上找了一下午,不是依赖版本出大问题,就是替换关键词时不时多一点或少一点,于是愤而找了个还算能运行的框架,自己修修改改,总算可以成功......
  • fabric compose文件解读(Orderer篇)
    orderer在fabric中的作用是排序,另外orderer有点像是管理节点一样,通道之类的都是在orderer的基础之上建立的,有点像比特币,以太坊上面的全节点一样,不过责任比全节点少很多,甚至......
  • 《Spatial-Spectral T ransformer for Hyperspectral Image Classification》论文笔记
    论文题目《Spatial-SpectralTransformerforHyperspectralImageClassification》 论文作者:XinHe1,YushiChen1,*andZhouhanLin2论文发表年份:2021模型简......