实现移动端头像截取并上传

秉承一贯原则,先上效果图

截取前:
图片的宽度是固定的  width:100%;padding:20px;
图片的宽度是固定的 width:100%;padding:20px;
显示的时候会自动根据原始图片的长宽设定

截取中:
这里写图片描述

截取后:
这里写图片描述
其实这里还有一点小bug 应该根据截取后的图片长宽比重新设定画板的高度和宽度

贴上主要代码:

user.head.cutimg

var CutImg = function() {
    this.startX;
    this.startY;
    this.ctx;
    this.canvas;
    this.marginTop;
    this.paddWidth = 20;  //TODO padding的高度  需要设定
    this.bufferImg;
    this.endX;
    this.endY;
    this.width;
    this.height;
}
CutImg.prototype.init = function(id, src) {  //初始化图片
    var cutImg = this;
    var clientWidth = document.body.clientWidth; //客户端的宽度
    cutImg.width = clientWidth - cutImg.paddWidth;
    var clientHeight = document.body.clientHeight; //客户端的高度
    var downX = 0; //点击时的第一个点
    var downY = 0;
    var canMove = false;
    var container = document.getElementById(id);
    cutImg.canvas = container;
    var marginTop; //距离上部的高度
    var padding = this.paddWidth;
    var containerBuffer = document.createElement("canvas"); //缓存图像
    container.width = clientWidth-cutImg.paddWidth;
    var ctx = container.getContext("2d");
    var ctxBuffer = containerBuffer.getContext("2d");
    ctx.lineWidth = 1;
    var img = new Image();
    img.src = src;
    img.onload = function() {
        //根据图片比例设定画板的高度
        var _imgRealWidth = img.width;
        var _imgRealHeight = img.height;
        var containerHeight = _imgRealHeight * (container.width / _imgRealWidth);
        container.height = containerHeight; //算出画板的高度
        cutImg.height = containerHeight;
        //根据画板的高度  得知画板距离上面的高度
        marginTop = 44 + (clientHeight - 44 - containerHeight) / 2; //TODO  注意 这个44是我头部的高度,如果没有头部 去掉他
        cutImg.marginTop = marginTop;
        containerBuffer.width = container.width;
        containerBuffer.height = container.height;
        ctxBuffer.drawImage(img, 0, 0, container.width, containerHeight); //生成缓存图像
        cutImg.bufferImg = containerBuffer;
        ctx.drawImage(containerBuffer, 0, 0, container.width, containerHeight);
        cutImg.ctx = ctx;
    };
    container.addEventListener('touchstart', function(e) {
        e.preventDefault();
        var touch = e.targetTouches[0];
        downX = touch.pageX;
        downY = touch.pageY;
        cutImg.startX = downX;
        cutImg.startY = downY;
        canMove = true;
    });
    container.addEventListener('touchmove', function(e) {
        if (canMove) {
            e.preventDefault();
            var touch = e.targetTouches[0];
            if (touch.pageX < downX || touch.pageY < downY)
                return;
            ctx.fillStyle = "rgba(0,0,0,.5)";
            ctx.strokeStyle = "rgba(0,0,0,.5)";
            ctx.clearRect(0, 0, this.width, this.height); //清楚绘画区域
            ctx.drawImage(containerBuffer, 0, 0, this.width, this.height); //画上原始图画
            var distaX = Math.abs(touch.pageX - downX);
            var distaY = Math.abs(touch.pageY - downY);
            var originX = downX + distaX / 2;
            var originY = downY + distaY / 2 - marginTop;
            var radius = distaX / 2;
            ctx.beginPath();
            //矩形的绘制方法
            ctx.strokeRect(downX, downY - marginTop, touch.pageX-downX, touch.pageY-downY);
            ctx.fillRect(0, 0, container.width, downY - marginTop);
            ctx.fillRect(0, downY - marginTop, downX, touch.pageY - downY);
            ctx.fillRect(touch.pageX, downY - marginTop, container.width - touch.pageX, touch.pageY - downY);
            ctx.fillRect(0, touch.pageY - marginTop, container.width, container.height + marginTop - touch.pageY);
            //绘制圆
            //          ctx.arc(originX,originY,radius,0,360,false);
            ctx.stroke();
            ctx.closePath();
            cutImg.endX = touch.pageX;
            cutImg.endY = touch.pageY;
        }
    },false);
    container.addEventListener('touchend', function(e) {
        canMove = false;
    });
}
CutImg.prototype.previewImg = function() { //预览图片
    this.ctx.clearRect(0, 0, this.width, this.height);
    this.ctx.drawImage(this.bufferImg, 
        this.startX, this.startY-this.marginTop, this.endX-this.startX, this.endY-this.startY, 
        0, 0, this.width,this.height);
}
CutImg.prototype.rebackImg = function(){  //返回图片数据
    return this.canvas.toDataURL();
}

通过上面的代码可以看出:
CutImg.init(“画板ID”,”图片路径”);
CutImg.previewImg(); //预览截取后的图片
cutImg.rebackImg(); //得到图片的字符集
注意上传的时候最好用
cutImg.rebackImg().substring(22);去掉图片前面的图片声明

需要改动的地方我都用了 TODO做标识。
还有就是画板本身是没有垂直居中效果的,我是用了样式来控制

<div class="hami-vertical-center-container" style="height: calc(100% - 44px);background: #000;">
            <canvas id="head_container" style="padding: 20px;">
            </canvas>
        </div>

如何设定hami-vertical-center-container这个class样式达到其子块的垂直居中效果

    width:100%;
    height:100%;
    -webkit-align-items: center;
    align-items: center;
    display: -webkit-flex;
    display: flex;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值