返回顶部
首页 > 资讯 > 精选 >使用fabric.js怎么实现一个明信片功能
  • 314
分享到

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

2023-06-14 06:06:15 314人浏览 独家记忆
摘要

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

使用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 src="./js/Jquery-3.4.1.min.js"></script><script src="./js/fabric.js"></script><script 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;  }    .canvassrc{    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="canvassrc" src="${exportedArt}"/>`)    }</script>

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

--结束END--

本文标题: 使用fabric.js怎么实现一个明信片功能

本文链接: https://lsjlt.com/news/268450.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用fabric.js怎么实现一个明信片功能
    使用fabric.js怎么实现一个明信片功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、fabric.js是一个很好用的 canvas 操作插件示例:pandas 是...
    99+
    2023-06-14
  • fabric.js实现diy明信片功能
    本文实例为大家分享了fabricjs实现diy明信片功能的具体代码,供大家参考,具体内容如下 前言 要求需要添加,拷贝,删除,双指放大缩小。 提示:以下是本篇文章正文内容,下面案例可...
    99+
    2024-04-02
  • 使用canvas怎么实现一个图片打码功能
    使用canvas怎么实现一个图片打码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先创建一个html文件, 并引入 vue 和 elelment-ui(注...
    99+
    2023-06-09
  • 使用Html5怎么实现一个微信语音功能
    使用Html5怎么实现一个微信语音功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要学会HTML5 的语音呢?Html5 规范推进,手机的更新加速了操作...
    99+
    2023-06-09
  • 怎么使用PHP实现一个短信验证码功能
    本篇内容介绍了“怎么使用PHP实现一个短信验证码功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一步:生成短信验证码要生成短信验证码,我...
    99+
    2023-07-05
  • 使用java怎么实现一个ATM功能
    使用java怎么实现一个ATM功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言...
    99+
    2023-06-14
  • JS怎么实现一个微信录音功能
    今天小编给大家分享一下JS怎么实现一个微信录音功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。拆解需求根据原型图可以很容易...
    99+
    2023-07-05
  • 利用golang怎么实现一个微信支付功能
    本文章向大家介绍利用golang怎么实现一个微信支付功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。golang的优点有哪些golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署...
    99+
    2023-06-06
  • Java中怎么实现一个图片剪裁功能
    Java中怎么实现一个图片剪裁功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Listing1: 引入的类import java.awt.Graphics;&n...
    99+
    2023-06-17
  • 使用canvas怎么实现一个滤镜功能
    使用canvas怎么实现一个滤镜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1 了解 canvas?1.1 什么是 canvas?这个 HTML 元素是为...
    99+
    2023-06-09
  • 使用canvas怎么实现一个拼图功能
    使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后...
    99+
    2023-06-09
  • 使用ajax怎么实现一个登录功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ajax的优点:最大的一点是页面无刷新,用户的体验非常好。使用异步方式与...
    99+
    2023-06-08
  • 使用Python怎么实现一个词云功能
    使用Python怎么实现一个词云功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言...
    99+
    2023-06-14
  • 使用Django怎么实现一个分页功能
    这篇文章主要为大家详细介绍了使用Django怎么实现一个分页功能,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:创建项目创建APP,添加APP这些就不在多说我们这次重点来看到视图函数下面是路由设置视图函数继承T...
    99+
    2023-06-06
  • 使用JavaScript怎么实现一个圆角功能
    使用JavaScript怎么实现一个圆角功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。找在IE下实现css3效果的圆角时找到的一个实例,没有测试,不知道使用起来怎么样,...
    99+
    2023-06-08
  • 使用CSS3怎么实现一个弹幕功能
    本篇文章给大家分享的是有关使用CSS3怎么实现一个弹幕功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.首先创建弹幕区域<div class="b...
    99+
    2023-06-08
  • 怎么在Android应用中实现一个实时通信功能
    今天就跟大家聊聊有关怎么在Android应用中实现一个实时通信功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现原理就是将发送端,接收端分别放进一个线程去运行,然后利用线程通信类...
    99+
    2023-05-31
    android roi
  • 使用ajax怎么实现一个实时验证功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个实时验证功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是ajaxAjax 即“Asynchronous Javascr...
    99+
    2023-06-08
  • 使用bootstrap怎么实现一个轮播图功能
    使用bootstrap实现轮播图的方法:1.新建html项目,导入bootstrap;2.添加轮播图容器;3.添加计数器;4.设置播放区域;具体步骤如下:首先,新建一个html项目,并使用link标签导入bootstrap;<!DOC...
    99+
    2024-04-02
  • 使用Reactor怎么实现一个Flink操作功能
    这篇文章给大家介绍使用Reactor怎么实现一个Flink操作功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现过程Flink对流式处理做的很好的封装,使用Flink的时候几乎不用关心线程池、积压、数据丢失等问题,...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作