canvas開發(fā)項目總結

canvas繪圖

  1. 對canvas設置寬高攻人,只能通過屬性設置庭惜。使用css設置寬高會讓canvas變形
let gameCanvas = document.getElementById('gameCanvas')
this.ctxWidth = document.documentElement.clientWidth
this.ctxHeight = document.documentElement.clientHeight
gameCanvas.width = this.ctxWidth
gameCanvas.height = this.ctxHeight
  1. 開發(fā)手機端頁面,需要考慮在canvas繪制圖片的清晰度問題涝开⊙剩可以使用hidpi-canvas插件。
    該插件對于在canvas中繪制各種形狀會自動進行高清處理舀武,但是圖片需要自己手動乘以設備像素比(devicePixelRatio)
    npm地址:https://www.npmjs.com/package/hidpi-canvas
import 'hidpi-canvas/dist/hidpi-canvas.min.js'
data () {
    return {
        pixelRatio:1 //通過計算獲取設備像素比
    }
}
mounted(){
    this.getPixelRatio()
}
methods: {
    getPixelRatio(){
      let backingStore = this.ctx.backingStorePixelRatio ||
              this.ctx.webkitBackingStorePixelRatio ||
              this.ctx.mozBackingStorePixelRatio ||
              this.ctx.msBackingStorePixelRatio ||
              this.ctx.oBackingStorePixelRatio ||
              this.ctx.backingStorePixelRatio || 1
      this.pixelRatio = (window.devicePixelRatio || 1) / backingStore
    },
    drawImg(){
        // 繪制矩形框
        this.drawDashRect(this.ctx,item.x-1,item.y-1,item.width+2,item.height+2)
        // 繪制圖片
        this.ctx.drawImage(this.clearIcon, (item.x - 12) * this.pixelRatio, (item.y - 12) * this.pixelRatio, 24 * this.pixelRatio, 24 * this.pixelRatio)
    }
}
  1. 對canvas需要進行touch事件處理時拄养,需要禁止頁面滾動和一些瀏覽器默認行為(比如微信的頂部下拉,ios瀏覽器的橡皮筋效果等)
mounted(){
    document.body.addEventListener('touchmove' , (e) => {
      e.preventDefault()
    })
}
<style scoped lang="scss">
    .wrapper{
        position: fixed;
        right:0;
        top:0;
        left:0;
        bottom:0;
    }
</style>

手機端調(diào)用相機

通過input type='file'來喚起相機银舱,通過該標簽的change事件處理圖片

<span><input id="upload" type="file" accept="image/*" capture="camera" @click="clearFile" @change="getCameraFile">與冰淇淋合影</span>
methods: {
    clearFile(){  //點擊的時候就清空input瘪匿,防止上傳圖片不變清空觸發(fā)不了change事件
      let file = document.getElementById('upload')
      file.value = ''
    },
    getCameraFile(){
      let fileInput = document.getElementById('upload')
      if (fileInput.files && fileInput.files[0]) {
        let vue_this = this
        // Exif插件用來獲取圖片的詳細信息
        Exif.getData(fileInput.files[0], function() {
          Exif.getAllTags(this)
          let Orientation = Exif.getTag(this, 'Orientation')  //Orientation是圖片的旋轉類型
          let reader = new FileReader()
          reader.onload = (e) => {
            // 此處寫后續(xù)的相關處理
            vue_this.cameraImg.src = e.target.result
            vue_this.createPhoto(Orientation)
            vue_this.createIce()
          }
          reader.readAsDataURL(fileInput.files[0])
        })
      }
    }
}

Exif插件處理手機拍照圖片的旋轉問題

在使用手機豎屏拍照時,把拍的照片直接拿過來用寻馏,發(fā)現(xiàn)圖片經(jīng)常是旋轉的棋弥。可以通過Exif插件來處理一下诚欠。
npm地址:https://www.npmjs.com/package/exif-js

import Exif from 'exif-js'
methods: {
    getCameraFile(){
      let fileInput = document.getElementById('upload')
      if (fileInput.files && fileInput.files[0]) {
        let vue_this = this
        // Exif插件用來獲取圖片的詳細信息
        Exif.getData(fileInput.files[0], function() {
          Exif.getAllTags(this)
          let Orientation = Exif.getTag(this, 'Orientation')  //Orientation是圖片的旋轉類型
          let reader = new FileReader()
          reader.onload = (e) => {
            // 此處寫后續(xù)的相關處理
            vue_this.cameraImg.src = e.target.result
            vue_this.createPhoto(Orientation)
            vue_this.createIce()
          }
          reader.readAsDataURL(fileInput.files[0])
        })
      }
    },
    // 針對不同的旋轉角度進行繪圖
    createPhoto(Orientation){
      this.cameraImg.onload = () => {
        let canvas = document.getElementById('cameraCanvas')
        canvas.width = this.ctxWidth
        canvas.height = this.ctxHeight
        this.photoCtx = canvas.getContext('2d')
        this.photoCtx.save()
        if(Orientation && Orientation != 1){
          switch(Orientation){
            case 6:     // 旋轉90度
                this.photoHeight = parseInt (this.ctxWidth * (this.cameraImg.width / this.cameraImg.height))
                canvas.width = this.photoHeight
                canvas.height = this.ctxWidth
                this.photoCtx.rotate(Math.PI / 2)
                // (0,-imgHeight) 從旋轉原始圖那里獲得的起始點
                this.photoCtx.drawImage(this.cameraImg, 0, -this.photoHeight, this.ctxWidth, this.photoHeight)
                this.photoCtx.restore()
                break
            case 3:     // 旋轉180度
                this.photoHeight = parseInt (this.ctxWidth * (this.cameraImg.height / this.cameraImg.width))
                canvas.height = this.photoHeight
                this.photoCtx.rotate(Math.PI)
                this.photoCtx.drawImage(this.cameraImg, -this.ctxWidth, -this.photoHeight, this.ctxWidth, this.photoHeight)
                this.photoCtx.restore()
                break
            case 8:     // 旋轉-90度
                this.photoHeight = parseInt (this.ctxWidth * (this.cameraImg.width / this.cameraImg.height))
                canvas.width = this.photoHeight
                canvas.height = this.ctxWidth
                this.photoCtx.rotate(3 * Math.PI / 2)
                this.photoCtx.drawImage(this.cameraImg, -this.ctxWidth, 0, this.ctxWidth, this.photoHeight)
                this.photoCtx.restore()
                break
          }
        } else{
          this.photoHeight = this.ctxHeight
          this.photoCtx.drawImage(this.cameraImg, 0, 0, this.ctxWidth*this.pixelRatio, this.ctxHeight*this.pixelRatio)
        }
        this.photoImg.src = canvas.toDataURL()
      }
    },
}

上傳圖片到后臺

直接向后臺傳base64格式的圖片會因為圖片太大等原因而報錯顽染,可以通過傳附件的形式向后臺傳輸。

methods:{
    save(){
      if (this.isSaved) {
        Toast('請掃描二維碼保存圖片聂薪!')
        return
      }
      // dataURL 的格式為 “data:image/png;base64,****”,逗號之前都是一些說明性的文字家乘,我們只需要逗號之后的就行了
      let imgdata=this.finalImg.split(',')[1]
      imgdata = window.atob(imgdata)
      let ia = new Uint8Array(imgdata.length)
      for (var i = 0; i < imgdata.length; i++) {
        ia[i] = imgdata.charCodeAt(i)
      }
      // canvas.toDataURL 返回的默認格式就是 image/png
      let blob = new Blob([ia], {type:"image/jpeg"})
      let fd = new FormData()
      fd.append('file',blob)
      this.$http.post('/api/hgds/image/uploadFile', fd, { headers: { 'Content-Type':'multipart/form-data' } }).then((data) => {
        //this.$http.post('/apis/hgds/image/uploadFile', fd, { headers: { 'Content-Type':'multipart/form-data' } }).then((data) => {
        this.ewmVisible = true
        this.ewmImg = data.qrcodeImgUrl
        this.isSaved = true
      })
    }
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市藏澳,隨后出現(xiàn)的幾起案子仁锯,更是在濱河造成了極大的恐慌,老刑警劉巖翔悠,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件业崖,死亡現(xiàn)場離奇詭異,居然都是意外死亡蓄愁,警方通過查閱死者的電腦和手機双炕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撮抓,“玉大人妇斤,你說我怎么就攤上這事〉ふ” “怎么了站超?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乖酬。 經(jīng)常有香客問我死相,道長,這世上最難降的妖魔是什么咬像? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任算撮,我火速辦了婚禮生宛,結果婚禮上,老公的妹妹穿的比我還像新娘肮柜。我一直安慰自己陷舅,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布素挽。 她就那樣靜靜地躺著蔑赘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪预明。 梳的紋絲不亂的頭發(fā)上缩赛,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音撰糠,去河邊找鬼酥馍。 笑死,一個胖子當著我的面吹牛阅酪,可吹牛的內(nèi)容都是我干的旨袒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼术辐,長吁一口氣:“原來是場噩夢啊……” “哼砚尽!你這毒婦竟也來了?” 一聲冷哼從身側響起辉词,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤必孤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瑞躺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敷搪,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年幢哨,在試婚紗的時候發(fā)現(xiàn)自己被綠了赡勘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡捞镰,死狀恐怖闸与,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岸售,我是刑警寧澤几迄,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站冰评,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏木羹。R本人自食惡果不足惜甲雅,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一解孙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抛人,春花似錦弛姜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绝页,卻和暖如春荠商,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背续誉。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工莱没, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酷鸦。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓饰躲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親臼隔。 傳聞我的和親對象是個殘疾皇子嘹裂,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容