我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用fabric.js怎么实现一个明信片功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用fabric.js怎么实现一个明信片功能

使用fabric.js怎么实现一个明信片功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、fabric.js是一个很好用的 canvas 操作插件

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、代码示例

代码如下(示例):

<!DOCTYPE html><html lang="en"><head><title>diy</title><meta charset="utf-8"><meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"><meta http-equiv="Access-Control-Allow-Origin" content="*" /><meta http-equiv="Expires" content="-1"><meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="Pragma" content="no-cache"><script class="lazy" data-src="./js/jquery-3.4.1.min.js"></script><script class="lazy" data-src="./js/fabric.js"></script><script class="lazy" data-src="./js/customiseControls.min.js"></script></head><style>  body{    margin: 0;    padding: 0;    border: 0;    font-size: 100%;    font-weight: normal;    vertical-align: baseline;      }    .end{    position: fixed;    top: 0;    right: 0;    width: 50px;    height: 20px;    background-color: #000000;    color: #ffffff;    font-size: 12px;    line-height: 20px;    z-index: 9999;  }  .canvasimg{    position: fixed;    top: 0;    left: 0;    width: 50px;    height: 20px;    background-color: #000000;    color: #ffffff;    font-size: 12px;    line-height: 20px;    z-index: 9999;  }  .canvasimg input{    position: absolute;    top: 0;    left: 0;    width: 100%;    height: 100%;    opacity: 0;  }  #inline-btn{    position: fixed;    opacity: 0;    z-index: 999;  }  #addinline-btn{    opacity: 0;    position: fixed;    z-index: 999;  }    .canvasclass="lazy" data-src{    position: fixed;    top: 0;    right: 0;    width: 100%;    height: 100%;    z-index: 9999;  }</style><body>  <div class="canvasimg"><input type="file" name="" id="canvasimg" class="canvasimgadd" type="file" accept="image/*" onchange="selectFileImage(this);" >添加图片</div>  <div class="end" onclick="linkcanvas()">生成图片</div>  <button id="inline-btn" onclick="canvasonclick()">删除图片按钮</button>  <button id="addinline-btn" onclick="copy()">复制图片按钮</button>  <canvas id="c"></canvas></body></html><script>  //参考链接  //文末查看比较详细的API中文解释  //http://fabricjs.com/ fabric.js官网  //diy功能需要有复制功能 删除功能 放大缩小移动旋转  //添加新图片  function selectFileImage(fileObj){    var file = fileObj.files['0'];    var reader = new FileReader();    reader.readAsDataURL(file)    reader.onload = function (e){      fabric.Image.fromURL(e.target.result, function (img) {        img.scale(1).set({          left: webwidth - (webwidth / 2),//图片左右居中          top: webheight - (webheight / 2), //图片上下居中 ,屏幕高度-(图片高度/2)的总值/2          angle: 0, //角度为0          originX: 'center',          originY: 'center',        });        //图片默认宽度充满屏幕一边留白20 高度自适应        img.scaleToWidth(webwidth - 40)        canvas.add(img).setActiveObject(img);        //清除线条        img.hasBorders = false;        //自定义图片功能按钮 , 隐藏多余功能按钮,只保留4个角的按钮        canvas.forEachObject(function (em) {          em['setControlVisible']('mtr', false);          em['setControlVisible']('mt', false);          em['setControlVisible']('ml', false);          em['setControlVisible']('mb', false);          em['setControlVisible']('mr', false);          em['setControlVisible']('mt', false);        })      });    }  }  // 删除按钮  var btn = document.getElementById('inline-btn')  // 添加按钮        var addbtn = document.getElementById('addinline-btn')  // 获取屏幕高宽度   var webwidth = $(window).width()  var webheight = $(window).height()  //创建画板  var canvas = new fabric.Canvas('c');  //canvas默认充满屏幕    canvas.setWidth(webwidth)    canvas.setHeight(webheight)    //导入图片     fabric.Image.fromURL('./imgs/2.jpg', function (img) {      img.scale(1).set({        left: webwidth - (webwidth/2),//图片左右居中        top: webheight-(webheight/2), //图片上下居中 ,屏幕高度-(图片高度/2)的总值/2        angle: 0, //角度为0        originX: 'center',        originY: 'center',      });      //图片默认宽度充满屏幕一边留白20 高度自适应      img.scaleToWidth(webwidth-40)      canvas.add(img).setActiveObject(img);      //清除线条      img.hasBorders = false;      //自定义图片功能按钮 , 隐藏多余功能按钮,只保留4个角的按钮      canvas.forEachObject(function(em){        em['setControlVisible']('mtr', false);         em['setControlVisible']('mt', false);        em['setControlVisible']('ml', false);        em['setControlVisible']('mb', false);        em['setControlVisible']('mr', false);        em['setControlVisible']('mt', false);      })    });    //取消多选    canvas.selection = false;    //新建图层不出现在顶层       canvas.preserveObjectStacking = true;        //注:要自定义修改按钮功能需要引入fabric的另一个叫customiseControls的JS插件 否则无法操作    //全局修改4个按钮的功能    fabric.Canvas.prototype.customiseControls({      bl: {        action: 'rotate' //添加图片旋转功能      },      // only is hasRotatingPoint is not set to false    }, function () {      canvas.renderAll();    });      //因为默认的按钮样式不是我们想要的 所以需要自定义一些icon在上面    fabric.Object.prototype.customiseCornerIcons({      tl: {        icon: './img/+1@2x.png', //图片路径        cornerSize: 70,   //按钮点击范围 相当于css的padding属性        settings: {          cornerSize: 25 //icon大小        },          },      tr: {        icon: './img/X@2x.png',        cornerSize: 70,          settings: {          cornerSize: 25        },               },      bl: {        icon: './img/xuanzhuan@2x.png',        cornerSize: 70,          settings: {          cornerSize: 25        },               },      br: {        icon: './img/fangda@2x.png',        cornerSize: 70,        settings: {          cornerSize: 25        },               },    }, function () {      canvas.renderAll();    });     //按钮跟随图片定位    function positionBtn(obj) {      //获取当前选中图片单位参数      var absCoords = canvas.getAbsoluteCoords(obj);      btn.style.width = '30px';      btn.style.height = '30px';      btn.style.opacity = '0';      btn.style.left = (absCoords.right - 30 / 2) + 'px';      btn.style.top = (absCoords.top - 30 / 2) + 'px';      addbtn.style.width = '30px';      addbtn.style.height = '30px';      addbtn.style.opacity = '0';      addbtn.style.left = (absCoords.left - 30 / 2) + 'px';      addbtn.style.top = (absCoords.leftTop - 30 / 2) + 'px';    }    fabric.Canvas.prototype.getAbsoluteCoords = function (object) {      return {        right: object.aCoords.tr.x + this._offset.left,        top:object.aCoords.tr.y + this._offset.top,        left: object.aCoords.tl.x + this._offset.left,        leftTop: object.aCoords.tl.y + this._offset.top,      };    }    //删除当前选中图片    function canvasonclick(){      var t = canvas.getActiveObject()      canvas.remove(t);    }    //拷贝当前选中图片    function copy(){      var _self = this;      canvas.getActiveObject().clone(function (cloned) {        _self.paste(cloned);        canvas.discardActiveObject().renderAll()      })    }        function paste(_clipboard){      console.log(_clipboard)      var t = canvas.getActiveObject();      // 再次克隆,这样你就可以复制多个副本。      t.clone(function (clonedObj) {        canvas.discardActiveObject();        clonedObj.set({          left: clonedObj.left + 20,          top: clonedObj.top + 20,          evented: true,          hasBorders:false        });        if (clonedObj.type === 'activeSelection') {          // 活动选择需要对画布的引用。          clonedObj.canvas = canvas;          clonedObj.forEachObject(function (obj) {            canvas.add(obj);              canvas.forEachObject(function (em) {              em['setControlVisible']('mtr', false);              em['setControlVisible']('mt', false);              em['setControlVisible']('ml', false);              em['setControlVisible']('mb', false);              em['setControlVisible']('mr', false);              em['setControlVisible']('mt', false);            })                                });          // 解决不可选择的问题          clonedObj.setCoords();        } else {          canvas.add(clonedObj);          canvas.forEachObject(function (em) {            em['setControlVisible']('mtr', false);            em['setControlVisible']('mt', false);            em['setControlVisible']('ml', false);            em['setControlVisible']('mb', false);            em['setControlVisible']('mr', false);            em['setControlVisible']('mt', false);          })                  }      });         }    var store = {}    //计算平均值    var getDistance = function (start, stop) {      return Math.hypot(stop.x - start.x, stop.y - start.y);    };        //监听positionBtn事件 鼠标以上点击图片时移动时触发我们自定义的复制按钮和删除按钮跟随图片定位以及双指放大缩小功能    canvas.on('mouse:down',function(options){      //判断是否点击到了图片单位      if(options.target){        //运行事件        positionBtn(options.target);        //双指放大缩小        store.pageX = options.e.changedTouches[0].clientX        store.pageY = options.e.changedTouches[0].clientY        if (options.e.changedTouches.length == 2) {          store.pageY2 = options.e.changedTouches[1].clientY          store.pageX2 = options.e.changedTouches[1].clientX        }        store.originScale = options.target.scaleX || 0.5;        store.originleft = options.target.left;        store.origintop = options.target.top;      }    });                    canvas.on('mouse:move',function(options){      if(options.target){        positionBtn(options.target);        if (options.e.changedTouches.length == 2) {          if (!store.pageX2) {            store.pageX2 = options.e.changedTouches[1].clientX          }          if (!store.pageY2) {            store.pageY2 = options.e.changedTouches[1].clientY          }          var zoom = getDistance({            x: options.e.changedTouches[0].clientX,            y: options.e.changedTouches[0].clientY          }, {            x: options.e.changedTouches[1].clientX,            y: options.e.changedTouches[1].clientY          }) /            getDistance({              x: store.pageX,              y: store.pageY            }, {              x: store.pageX2,              y: store.pageY2            });          var newScale = store.originScale * zoom;          if (newScale > 3) {            newScale = 3;          }           options.target.scaleX = newScale;          options.target.scaleY = newScale;          canvas.renderAll();        }                }    });      canvas.on('mouse:up',function(options){      if(options.target){        positionBtn(options.target);           store.pageY = 0        store.pageX = 0        store.pageY2 = 0        store.pageX2 = 0            store.originScale = options.target.scaleX         store.originleft = options.target.left          store.origintop = options.target.top            }    });     //生成明信片    function linkcanvas(){      let xheight = $('#c').height()      let xwidth = $('#c').width()      canvas.setBackgroundColor('rgba(255, 255, 255, 1)', canvas.renderAll.bind(canvas));      var exportedArt = this.canvas.toDataURL({        format: "jpeg",        quality: 1.0,        multiplier: 2.4,        left: 0,        top: 0,        width: xwidth,        height: xheight,      });      $('body').append(`<img class="canvasclass="lazy" data-src" class="lazy" data-src="${exportedArt}"/>`)    }</script>

关于使用fabric.js怎么实现一个明信片功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用fabric.js怎么实现一个明信片功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用fabric.js怎么实现一个明信片功能

使用fabric.js怎么实现一个明信片功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、fabric.js是一个很好用的 canvas 操作插件示例:pandas 是
2023-06-14

使用canvas怎么实现一个图片打码功能

使用canvas怎么实现一个图片打码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先创建一个html文件, 并引入 vue 和 elelment-ui(注
2023-06-09

使用Html5怎么实现一个微信语音功能

使用Html5怎么实现一个微信语音功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要学会HTML5 的语音呢?1.Html5 规范推进,手机的更新加速了
2023-06-09

怎么使用PHP实现一个短信验证码功能

本篇内容介绍了“怎么使用PHP实现一个短信验证码功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一步:生成短信验证码要生成短信验证码,我
2023-07-05

使用java怎么实现一个ATM功能

使用java怎么实现一个ATM功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言
2023-06-14

使用CSS3怎么实现一个弹幕功能

本篇文章给大家分享的是有关使用CSS3怎么实现一个弹幕功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.首先创建弹幕区域
2023-06-08

使用Python怎么实现一个词云功能

使用Python怎么实现一个词云功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言
2023-06-14

利用golang怎么实现一个微信支付功能

本文章向大家介绍利用golang怎么实现一个微信支付功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。golang的优点有哪些golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署
2023-06-06

JS怎么实现一个微信录音功能

今天小编给大家分享一下JS怎么实现一个微信录音功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。拆解需求根据原型图可以很容易
2023-07-05

使用Django怎么实现一个分页功能

这篇文章主要为大家详细介绍了使用Django怎么实现一个分页功能,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:创建项目创建APP,添加APP这些就不在多说我们这次重点来看到视图函数下面是路由设置视图函数继承T
2023-06-06

使用ajax怎么实现一个登录功能

本篇文章给大家分享的是有关使用ajax怎么实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ajax的优点:1、最大的一点是页面无刷新,用户的体验非常好。2、使用异
2023-06-08

使用canvas怎么实现一个拼图功能

使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后
2023-06-09

使用canvas怎么实现一个滤镜功能

使用canvas怎么实现一个滤镜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1 了解 canvas?1.1 什么是 canvas?这个 HTML 元素是为
2023-06-09

使用JavaScript怎么实现一个圆角功能

使用JavaScript怎么实现一个圆角功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。找在IE下实现css3效果的圆角时找到的一个实例,没有测试,不知道使用起来怎么样,
2023-06-08

Java中怎么实现一个图片剪裁功能

Java中怎么实现一个图片剪裁功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Listing1: 引入的类import java.awt.Graphics; impor
2023-06-17

怎么在Android应用中实现一个实时通信功能

今天就跟大家聊聊有关怎么在Android应用中实现一个实时通信功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现原理就是将发送端,接收端分别放进一个线程去运行,然后利用线程通信类
2023-05-31

使用ajax怎么实现一个实时验证功能

本篇文章给大家分享的是有关使用ajax怎么实现一个实时验证功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是ajaxAjax 即“Asynchronous Javascr
2023-06-08

使用Reactor怎么实现一个Flink操作功能

这篇文章给大家介绍使用Reactor怎么实现一个Flink操作功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现过程Flink对流式处理做的很好的封装,使用Flink的时候几乎不用关心线程池、积压、数据丢失等问题,
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录