zoukankan      html  css  js  c++  java
  • canvas 截取

    今天分享的是业务中遇到的一个技术问题,提炼为关于canvas实现从已知画布截取部分并保存为图片上传服务器

    canvas背景知识补充:
    1.<canvas> 标签只有两个属性—— width和height。这些都是可选的,并且同样利用 DOM properties 来设置。
    当开始时没有为canvas规定样式规则,其将会完全透明,也就是说最终转化保存的图片是透明背景色的。
    
    2.canvas更有意思的一项特性就是图像操作能力。可以用于动态的图像合成或者作为图形的背景,以及游戏界面(Sprites)等等。浏览器支持的任意格式的外部图片都可以使用,比如PNG、GIF或者JPEG。 你甚至可以将同一个页面中其他canvas元素生成的图片作为图片源。
    
    1.裁剪画布

    在最近的项目中,我遇到了一个问题,原本我通过计算知道了截取初始位置,宽和高,想着怎么修改插件源码让canvas只绘制我想要的部分,发现源码并不好改,牵扯内容太多,于是可以将同一个页面中其他canvas元素生成的图片作为图片源 canvas这个技术点便成了关键,以已知画布canvas1作为图片源,新建一个新的画布,将所要的目标图片部分重绘到新画布即可

    关键代码原理

    ctx.drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
    //dx, dy, dWidth, dHeight,表示在canvas画布上规划处一片区域用来放置图片,dx, dy为canvas元素的左上角坐标,dWidth, dHeight指canvas元素上用在显示图片的区域大小
    
    //sx,sy,swidth,sheight,这4个坐标是针对图片元素的,表示图片在canvas画布上显示的大小和位置。sx,sy表示图片上sx,sy这个坐标作为左上角,然后往右下角的swidth,sheight尺寸范围图片作为最终在canvas上显示的图片内容。
    

    代码实现如下:

    //计算得到画布canvasX(宽),canvasY(高),startX(起始位置横坐标),startY(起始位置纵坐标),已知画布canvas1
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    canvas.width = canvasX;
    canvas.height = canvasY;
    ctx.drawImage(canvas1, startX, startY, canvasX, canvasY, 0, 0, canvasX, canvasY);
    document.body.appendChild(canvas);//查看重汇的canvas
    
    2.之后我要将截取的部分图canvas上传至服务器,利用canvas.toBlob方法即可实现

    关键代码语法:

    void canvas.toBlob(callback, type, encoderOptions);
    //callback:回调函数,可获得一个单独的Blob对象参数。
    //type 可选 DOMString类型,指定图片格式,默认格式为image/png。
    

    业务代码如下:

    canvas.toBlob(function (blob) {
       console.log(blob)
       var form = new FormData();
      	form.append('image', blob, 'a.png');
        api.uploadImage(form).then(data => {
            console.log(data.url);
         });
    
     })
    

    参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API

  • 相关阅读:
    linux 进入 GNOME X 界面
    POJ 3436 ACM Computer Factory (拆点+最大流)
    学习:EF(Entity Framwork)结构【转】
    .net上传Excel,解析Excel,导出CSV
    在Handler里面使用Session
    如何用JavaScript判断访问的来源是电脑还是手机,是什么浏览器?
    ASP.NET List泛型分页代码 【转】
    ASP.NET MVC中实现多个按钮提交的几种方法【转】
    清空数据库所有表,所有存储过程SQL语句
    可以不被浏览器拦截的弹出窗口
  • 原文地址:https://www.cnblogs.com/shuia/p/9300126.html
Copyright © 2011-2022 走看看