html 2 canvasによるモバイル端末のアップロード画像生成ポスターの実現


原文リンク:リンク記述vue+html 2 canvas+exif-js githubアドレスラインdemoを使用
主な機能
  • アップロード画像
  • 画像を操作する:
  • を移動、拡大、縮小する.
  • 合成ポスター
  • 具体的な機能:
    画像をアップロード
    html:

    js
    getPhoto () {
        var imageInput = document.querySelector('#image-input')
        var that = this
        imageInput.addEventListener('change', function (e) {
            reads = new FileReader()
            reads.readAsDataURL(this.files[0])
            reads.addEventListener('load', function (e) {
                that.imgUrl = this.result
                that.myImg.position.x = 0
                that.myImg.position.y = 0
                that.myImg.scale = 1
                var orientation
                that.previewImg.addEventListener('load', function () {
                    Exif.getData(that.previewImg, function() { //        
                    Exif.getAllTags(this); //          ,         
                    orientation = Exif.getTag(this, "Orientation"); //          
                    var rotateCanvas = document.createElement("canvas"),
                    rotateCtx = rotateCanvas.getContext("2d");
                     //           
                    switch (orientation) {
                        case 1 :
                            rotateCanvas.width = that.previewImg.width;
                            rotateCanvas.height = that.previewImg.height;
                            rotateCtx.drawImage(that.previewImg, 0, 0, that.previewImg.width, that.previewImg.height);
                            break;
                        case 6 : //     90  
                            rotateCanvas.width = that.previewImg.height;
                            rotateCanvas.height = that.previewImg.width;
                            rotateCtx.translate(0, 0);
                            rotateCtx.rotate(90 * Math.PI / 180);
                            rotateCtx.drawImage(that.previewImg, 0, -that.previewImg.height, that.previewImg.width, that.previewImg.height);
                            break;
                        case 8 :
                            rotateCanvas.width = that.previewImg.height;
                            rotateCanvas.height = that.previewImg.width;
                            rotateCtx.translate(0, 0);
                            rotateCtx.rotate(-90 * Math.PI / 180);
                            rotateCtx.drawImage(that.previewImg, -that.previewImg.width, 0, that.previewImg.width, that.previewImg.height);
                            break;
                        case 3 : // 180  
                            rotateCanvas.width = that.previewImg.width;
                            rotateCanvas.height = that.previewImg.height;
                            rotateCtx.translate(0, 0);
                            rotateCtx.rotate(Math.PI);
                            rotateCtx.drawImage(that.previewImg, -that.previewImg.width, -that.previewImg.height, that.previewImg.width, that.previewImg.height);
                            break;
                        default :
                            rotateCanvas.width = that.previewImg.width;
                            rotateCanvas.height = that.previewImg.height;
                            rotateCtx.drawImage(that.previewImg, 0, 0, that.previewImg.width, that.previewImg.height);
                        }
                        var rotateBase64 = rotateCanvas.toDataURL("image/jpeg", 0.5);
                    });
                })
            }) 
        })
    }

    画像を移動
    画像とフォトフレームのバインド@touchstart@touchmove@touchend
    getInitPosition (e) {
        event.preventDefault()
        if (this.imgUrl) {
            var length = e.touches.length
             if (length > 1) {
                let pointOne = e.touches[0]
                let pointTwo = e.touches[1]
                this.initTouchX = pointOne.clientX - pointTwo.clientX
                this.initTouchY = pointOne.clientY - pointTwo.clientY
            } else {
                var touches = e.touches[0]
                this.initTouchX = touches.clientX
                this.initTouchY = touches.clientY
            }   
        }
    },
     getMovePosition (e) {
        event.preventDefault()
        if (this.imgUrl) {
            var length = e.touches.length
            if (length > 1) {
                let pointOne = e.touches[0]
                let pointTwo = e.touches[1]
                this.changeTouchX = pointOne.clientX - pointTwo.clientX
                this.changeTouchY = pointOne.clientY - pointTwo.clientY
                var scale = (this.changeTouchX - this.initTouchX) > (this.changeTouchY - this.initTouchY) ? (this.changeTouchX / this.initTouchX) : (this.changeTouchY / this.initTouchY) 
                scale *= this.myImg.lastScale
                this.myImg.scale = scale > 3 ? 3 : scale < 0.5 ? 0.5 : scale
            } else {
                var touches = e.touches[0]
                this.changeTouchX = touches.clientX - this.initTouchX
                this.changeTouchY = touches.clientY - this.initTouchY
                this.myImg.position.x = this.lastTouchX + (this.changeTouchX / this.myImg.scale)
                this.myImg.position.y = this.lastTouchY + (this.changeTouchY / this.myImg.scale)
            }   
        }
    },
    getLeavePosition (e) {
        this.myImg.lastScale = this.myImg.scale
        if (e.touches.length > 0) {
            var touches = e.touches[0]
            this.initTouchX = touches.clientX
            this.initTouchY = touches.clientY
        }
        this.lastTouchX = this.myImg.position.x
        this.lastTouchY = this.myImg.position.y
    },

    合成画像
    createPhoto () {
        if (this.imgUrl) {
            let photoBox = document.querySelector('.photo-box')
            newImgWidth = photoBox.style.offsetWidth
            let newImgHeight = photoBox.style.offsetHeight
            let scale = window.devicePixelRatio
            let that = this
            html2canvas(photoBox, {
                width: newImgWidth,
                height: newImgHeight,
                scale: scale,
                useCORS: true
            }).then(function (canvas) { 
                var dataUrl = canvas.toDataURL('image/jpg')
                localStorage.imgData = dataUrl
                that.$router.push({
                    name: 'share',
                    params: {
                        storage: 'imgData'
                    }
                })
            })
        } else {
            alert('     ')
        }
    }

    問題
    1)ブラウザでズームをブロックする問題
     tounchmove   event.preventDefault()

    2)合成画像の鮮明度
     html2canvas    ,scale = window.devicePixelRatio

    3)画像を拡大・縮小する際の距離の判断
              :
    -     
    -       
                            。   touchend ,e.touches       。            。

    4)vueを使用する:style=「インラインスタイル」で発生した書き方の問題
    :style="{transform:'scale('+ myImg.scale+ ') translate('+myImg.position.x+'px,'+myImg.position.y+'px)'}"

    5)