美文网首页
Canvas 裁剪与缩放

Canvas 裁剪与缩放

作者: 依然还是或者其他 | 来源:发表于2021-03-04 22:33 被阅读0次

    Canvas 裁剪与缩放

    裁剪与缩放

    
        //CropWidth  CropHeight为设置的宽高 ,可自行设置
        const canvas = document.createElement("canvas");
        canvas.width = CropWidth;
        canvas.height = CropHeight;
        const ctx = canvas.getContext("2d");
        ctx.fillStyle = "#ffffff";
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        ctx.drawImage(
          image,  //原图片
          croppedAreaPixels.x,  //需要绘制到目标上下文中的,image的矩形(裁剪)选择框的左上角 X 轴坐标。
          croppedAreaPixels.y,  // 需要绘制到目标上下文中的,image的矩形(裁剪)选择框的左上角 Y 轴坐标。
          croppedAreaPixels.width,  //需要绘制到目标上下文中的,image的矩形(裁剪)选择框的宽度。
          croppedAreaPixels.height, //需要绘制到目标上下文中的,image的矩形(裁剪)选择框的高度。
          0, //image的左上角在目标canvas上 X 轴坐标。
          0, //image的左上角在目标canvas上 Y 轴坐标。
          CropWidth,  //image在目标canvas上绘制的宽度。 允许对绘制的image进行缩放。 
          CropHeight  //image在目标canvas上绘制的高度。 允许对绘制的image进行缩放。 
        );
        
    
    

    HTMLCanvasElement.toBlob() 方法创造Blob对象,用以展示canvas上的图片;这个图片文件可以被缓存或保存到本地,由用户代理端自行决定。如不特别指明,图片的类型默认为 image/png,分辨率为96dpi。

    第三个参数用于针对image/jpeg格式的图片进行输出图片的质量设置。

    canvas.toBlob(callback, type, encoderOptions);

    • callback
      回调函数,可获得一个单独的Blob对象参数。
    • type 可选
      DOMString类型,指定图片格式,默认格式为image/png。
    • encoderOptions 可选
      Number类型,值在0与1之间,当请求图片格式为image/jpeg或者image/webp时用来指定图片展示质量。如果这个参数的值不在指定类型与范围之内,则使用默认值,其余参数将被忽略。
    canvas.toBlob((blob)=>{
            // 得到裁剪或缩放后的图片blob 
        },"image/jpeg")
    

    跨域问题

    • 对于专门放置静态资源的服务器,可以通过在header中配置Access-Control-Allow-Origin,来进行跨域访问图片。

      header("Access-Control-Allow-Origin: *");
      //
      header("Access-Control-Allow-Origin: www.baidu.com");
      
      
    • HTML crossOrigin属性解决资源跨域问题

    关键字 说明
    anonymous 元素的跨域资源请求不需要凭证标志设置。 只要crossOrigin的属性值不是use-credentials,全部都会解析为anonymous,包括空字符串,包括类似'abc'这样的字符
    use-credentials 元素的跨域资源请求需要凭证标志设置,意味着该请求需要提供凭证。
    var canvas = document.createElement('canvas');
    var context = canvas.getContext('2d');
        
    var img = new Image();
        
    // 添加后就可以避免跨域的报错
    // img.crossOrigin = 'anonymous';
    img.crossOrigin = '';
    img.onload = function () {
        context.drawImage(this, 0, 0);
        //这样会导致报错
        context.getImageData(0, 0, this.width, this.height);
    };
    img.src = 'https://avatars3.githubusercontent.com/u/496048?s=120&v=4';';
    
    • ajax和URL.createObjectURL()
    var xhr = new XMLHttpRequest();
    xhr.onload = function () {
        var url = URL.createObjectURL(this.response);
        var img = new Image();
        img.onload = function () {
            // 此时你就可以使用canvas对img为所欲为了
            // ... code ...
            // 图片用完后记得释放内存
            URL.revokeObjectURL(url);
        };
        img.src = url;
    };
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.send();
    

    优化

    对于图片裁剪缩放这类可能比较消耗资源的处理,可以利用WebWork启用另一个线程来进行处理,并且不会影响当前流程业务处理。

    main.js

    const option={
        ....// 图片裁剪的需要的参数
    } 
    //
    
    const work = new Worker("work.js");      
    //发送裁剪请求
    work.postMessage(option);
    // 监听消息
    work.onmessage = function(blob) {
        console.log("图片",blob);
    };
    

    work.js

    onmessage = function (option) {
    
    //接收参数,进行图片裁剪
    //最后返回blob
    postMessage(blob);
    }
    

    参考

    https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/drawImage

    https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toBlob

    https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API

    相关文章

      网友评论

          本文标题:Canvas 裁剪与缩放

          本文链接:https://www.haomeiwen.com/subject/enjlqltx.html