js通过图片坐标信息进行切图处理,并返回切图结果

 根据left, top, width, height在原图基础上进行切图处理,handleImgData为要处理的源图片(推荐base64格式),cutImageShowDomID为img标签的id(最终返回切图展示的地方)

 

cutImage(handleImgData, left, top, width, height, cutImageShowDomID) {
        window.URL = window.URL || window.webkitURL;
        var xhr = new XMLHttpRequest();
        xhr.open("get", handleImgData, true);
        xhr.responseType = "blob";
        xhr.onload = function () {
            if (this.status == 200) {
                let blob = this.response;
                let oFileReader = new FileReader();
                oFileReader.onloadend = function (e) {
                    let base64ImgData = e.target.result;
                    let img = new Image()
                    img.src = base64ImgData
                    let canvas = document.createElement('canvas');
                    let ctx = canvas.getContext('2d');
                    const clipPos = [[left, top], [(left + width), top], [left, (top + height)], [(left + width), (top + height)]]
                    img.onload = function () {
                        canvas.width = img.width;
                        canvas.height = img.height;
                        ctx.beginPath();
                        ctx.moveTo(clipPos[0][0], clipPos[0][1]);
                        ctx.lineTo(clipPos[1][0], clipPos[1][1]);
                        ctx.lineTo(clipPos[3][0], clipPos[3][1]);
                        ctx.lineTo(clipPos[2][0], clipPos[2][1]);
                        ctx.clip();
                        ctx.drawImage(img, 0, 0, img.width, img.height);
                        let minLeft = clipPos[0][0], maxLeft = clipPos[0][0], minTop = clipPos[0][1], maxTop = clipPos[0][1]
                        for (let index = 1; index < clipPos.length; index++) {
                            const item = clipPos[index];
                            if (item[0] < minLeft) {
                                minLeft = item[0]
                            }
                            if (item[0] > maxLeft) {
                                maxLeft = item[0]
                            }
                            if (item[1] < minTop) {
                                minTop = item[1]
                            }
                            if (item[1] > maxTop) {
                                maxTop = item[1]
                            }
                        }
                        const imgClipData = ctx.getImageData(minLeft, minTop, maxLeft - minLeft, maxTop - minTop);
                        const canvas2 = document.createElement('canvas');
                        const ctx2 = canvas2.getContext("2d")
                        canvas2.width = imgClipData.width
                        canvas2.height = imgClipData.height
                        ctx2.putImageData(imgClipData, 0, 0, 0, 0, imgClipData.width, imgClipData.height)
                        document.getElementById(cutImageShowDomID).src = canvas2.toDataURL("image/jpg");
                    }
                };
                oFileReader.readAsDataURL(blob);
            }
        }
        xhr.send();
    },

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值