zoukankan      html  css  js  c++  java
  • 微信小程序 画布drawImage实现图片截取

    大多数图片都大小不一,选择框的尺寸也是宽高相等的,就会有图片被压缩

    解决方法:

    1.可以使用画布对图片先进行截取,保存截取图片(用户自己选取,或者指定图片中心区域截取),但是对于多张图片手动截取,会影响体验

    2.保证图片完整性,使用image组件的mode属性,可以设置图片裁剪、缩放的模式,点击图片查看之后才会看到整张图片,默认为scaleToFill,但就像上面说的一样,图片会被压缩,但我们只需要显示图片的中心区域,使用aspectFill,图片就会取到中心位置 

     官方是这样描述的:

     我用的是第二种方法,项目图片中设置这样一个属性就可以了,但是要在画布上显示图片中心位置,就要对图片进行截取了

     查了一下,正好官方也给出了drawImage的介绍,正好有几个图片截取的属性值 

     有三个版本的写法:

    • drawImage(dx, dy)
    • drawImage(dx, dy, dWidth, dHeight)
    • drawImage(sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 从 1.9.0 起支持 

     sx : 源图像的矩形选择框的左上角 x 坐标

     sy : 源图像的矩形选择框的左上角 y 坐标

       sWidth : 源图像的矩形选择框的宽度

       sHeight : 源图像的矩形选择框的高度

     第一种情况(画布的宽度大于高度)

      横图(上面是画布截取的,下面是图片属性mode=aspectFill生成的)       竖图   

                                 

     第二种情况(画布的宽度小于高度)

      横图                                    竖图

                                          

      

     第三种情况(宽高相等)

      横图                                    竖图

                                    

       以上就是对图片属性值aspectFill的实现

      

    <view class='center colu'>
      <canvas style='{{canvas_width}}px;height:{{canvas_height}}px' canvas-id='my_canvas'></canvas>
      <image mode='aspectFill' style='{{canvas_width}}px;height:{{canvas_height}}px;margin-top:10px' src='{{img}}'></image>
    </view>
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        canvas_ 200,
        canvas_height: 300,
        img: '../../images/zly.JPG'
      },
      onLoad() {
        this.canvas();
      },
      canvas() {
        var ctx = wx.createCanvasContext('my_canvas', this)
        var canvas_width = this.data.canvas_width,
          canvas_height = this.data.canvas_height;
        var img = this.data.img;
        wx.getImageInfo({
          src: img,
          success(res) {
            console.log(res.width, res.height);
    
            var img_width = res.width,
              img_height = res.height;
    
            var clip_left, clip_top, //左偏移值,上偏移值,
              clip_width, clip_height; //截取宽度,截取高度
    
            clip_height = img_width * (canvas_height / canvas_width);
            if (clip_height > img_height) {
              clip_height = img_height;
              clip_width = clip_height * (canvas_width / canvas_height);
              clip_left = (img_width - clip_width) / 2;
              clip_top = 0;
            } else {
              clip_left = 0;
              clip_top = (img_height - clip_height) / 2;
              clip_width = img_width
            }
    
            var data = {
              clip_left,
              clip_top,
              clip_width,
              clip_height
            }
    
            ctx.drawImage(img, clip_left, clip_top, clip_width, clip_height, 0, 0, canvas_width, canvas_height);
            ctx.draw();
          }
        })
      }
    })

               

           

         

                    

                  

  • 相关阅读:
    [考试]20151017数据结构
    [考试]20151016动态规划
    [考试]20151015分治
    [BZOJ1501/NOI2005]智慧珠游戏
    [BZOJ3139/HNOI2013]比赛
    [考试]20151013搜索
    BZOJ3082: Graph2
    BZOJ4690: Never Wait for Weights
    BZOJ4668: 冷战
    BZOJ3262: 陌上花开
  • 原文地址:https://www.cnblogs.com/dongzhi1111/p/10001414.html
Copyright © 2011-2022 走看看