国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微信小程序 Canvas裁切案例

這篇具有很好參考價(jià)值的文章主要介紹了微信小程序 Canvas裁切案例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

源于 https://ask.csdn.net/questions/7797682

效果

輸入

微信小程序 Canvas裁切案例

輸出

微信小程序 Canvas裁切案例

環(huán)境

基礎(chǔ)庫版本 2.20.x使用的新版的canvas(也不算新兩三年了)。

知識(shí)點(diǎn)
  1. canvas

  2. base64轉(zhuǎn)臨時(shí)路徑

代碼

index.wxml

<canvas type="2d" id="photo" class="photo" disable-scroll="{{true}}" style="width: {{width}}rpx;height: {{height}}rpx;"></canvas>
<button type="primary" bindtap="chooseImage">選擇照片</button>

index.wxss

.photo {
  margin: 80rpx auto;
  background-color: rgb(68, 48, 247);
  border: 4px solid #ddd;
}

index.js 重點(diǎn)

代碼沒有進(jìn)行封裝,僅僅只是方便預(yù)覽

const app = getApp()

Page({
  data: {
    canvas: null,
    ctx: null,
    height: 441,
    width: 358,
  },
  onReady() {
    // 創(chuàng)建一個(gè) SelectorQuery 對(duì)象,選擇器選取范圍為這個(gè)組件實(shí)例內(nèi)
    const query = this.createSelectorQuery()
    // 選擇wxml上id是photo的元素
    query.select('#photo').fields({ node: true, size: true });
    // 執(zhí)行
    query.exec((res) => {
      const canvas = res[0].node // 因?yàn)榉祷氐氖菙?shù)組 所以要去第一個(gè)
      const ctx = canvas.getContext('2d') // 獲取畫布內(nèi)容 
      canvas.width = this.data.width  // 真實(shí)寬度 
      canvas.height = this.data.height  // 真實(shí)高度  
      this.data.canvas = canvas; // 暫存到data中方便其他方法調(diào)用
      this.data.ctx = ctx; // 暫存到data中方便其他方法調(diào)用
    })
  },
  chooseImage() { // 選擇圖片
    wx.chooseMedia({ // 選擇媒體
      count: 1, // 照片數(shù)量
      mediaType: ['image'], // 圖片
      sourceType: ['album'], // 相冊(cè)
      success: (res) => {
        let tempFilePath = res.tempFiles[0].tempFilePath
        const canvas = this.data.canvas; // 畫布 
        const ctx = this.data.ctx;
        const { width, height } = canvas; // 畫布的大小
        let tempImage = canvas.createImage();
        tempImage.src = tempFilePath;
        tempImage.onload = () => {
          // fill 填充模式
          let originWidth = tempImage.width; // 原寬度
          let originHeight = tempImage.height; // 原高度
          let targetWidth = width; // 目標(biāo)寬度
          let targetHeight = height; // 目標(biāo)高度 
          let scale = 0; // 臨時(shí)比例 
          // 當(dāng)原寬度小于原高度時(shí)
          if (originWidth < originHeight) {
            // 臨時(shí)比例暫存 
            scale = originWidth / originHeight;
            originWidth = targetWidth;
            originHeight = originWidth / scale;
          }
          // 非
          else {
            scale = originWidth / originHeight;
            originHeight = targetHeight;
            originWidth = originHeight * scale;
          }
          // 計(jì)算偏移量
          const offsetX = - (originWidth - targetWidth) / 2
          const offsetY = - (originHeight - targetHeight) / 2
          // 清空畫布
          ctx.clearRect(0, 0, canvas.width, canvas.height)

          // 繪制圖片
          ctx.drawImage(tempImage, offsetX, offsetY, originWidth, originHeight)
          const base64 = canvas.toDataURL() // canvas輸出base64
          const fs = wx.getFileSystemManager(); // 獲取獲取全局唯一的文件管理器
          const filePath = wx.env.USER_DATA_PATH + '/tmp.png'; // 寫入臨時(shí)路徑
          fs.writeFile({
            filePath,
            data: base64.replace(/^data:image\/\w+;base64,/, ""), // 剔除base64特有前綴
            encoding: 'base64',
            success: (res) => {
              wx.saveImageToPhotosAlbum({ // 保存到手機(jī)相冊(cè)
                filePath,
                success: (res) => {
                  wx.showToast({
                    title: '保存成功',
                  })
                }
              })
            }
          });
        }
      }
    })
  }
})
源碼

完整代碼片段

https://developers.weixin.qq.com/s/ERW91Dma7QCP

私信的問題
Q: Camera 如何放置遮罩層?

如果想用cover-image組件,也是一樣,建議使用直接使用image組件。

微信小程序 Canvas裁切案例微信小程序 Canvas裁切案例

<camera device-position="back" flash="off" binderror="error" style="width: 100%; height: 300px;">
   <image src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13210298185%2F1000&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1667063277&t=74fe7de947f94409ff089e9b123d87ef"></image>
</camera>
評(píng)論的問題
Q: 使用Camera組件如何套用該案例?

將canvas組件復(fù)制到頁面中,把拍照返回的臨時(shí)圖片路徑替換到選擇圖片回調(diào)返回的臨時(shí)圖片。

代碼部分

index.wxml 節(jié)選

<!-- 追加到頁面 -->
<canvas type="2d" id="photo" class="photo" disable-scroll="{{true}}" style="width: {{width}}rpx;height: {{height}}rpx;"></canvas>

index.js 重點(diǎn)

const app = getApp()

Page({
    data: {
        canvas: null,
        ctx: null,
        height: 441,
        width: 358,
    },
    onReady() {
        // 創(chuàng)建一個(gè) SelectorQuery 對(duì)象,選擇器選取范圍為這個(gè)組件實(shí)例內(nèi)
        const query = this.createSelectorQuery()
        // 選擇wxml上id是photo的元素
        query.select('#photo').fields({ node: true, size: true });
        // 執(zhí)行
        query.exec((res) => {
            const canvas = res[0].node // 因?yàn)榉祷氐氖菙?shù)組 所以要去第一個(gè)
            const ctx = canvas.getContext('2d') // 獲取畫布內(nèi)容 
            canvas.width = this.data.width  // 真實(shí)寬度 
            canvas.height = this.data.height  // 真實(shí)高度  
            this.data.canvas = canvas; // 暫存到data中方便其他方法調(diào)用
            this.data.ctx = ctx; // 暫存到data中方便其他方法調(diào)用
        })
    },
    onLoad() {
        this.ccc = wx.createCameraContext()
    },
    takePhoto() {
        this.ccc.takePhoto({
            quality: 'high',
            success: (res) => {
                let tempFilePath = res.tempImagePath
                const canvas = this.data.canvas; // 畫布 
                const ctx = this.data.ctx;
                const { width, height } = canvas; // 畫布的大小
                let tempImage = canvas.createImage();
                tempImage.src = tempFilePath;
                tempImage.onload = () => {
                    // fill 填充模式
                    let originWidth = tempImage.width; // 原寬度
                    let originHeight = tempImage.height; // 原高度
                    let targetWidth = width; // 目標(biāo)寬度
                    let targetHeight = height; // 目標(biāo)高度 
                    let scale = 0; // 臨時(shí)比例 
                    // 當(dāng)原寬度小于原高度時(shí)
                    if (originWidth < originHeight) {
                        // 臨時(shí)比例暫存 
                        scale = originWidth / originHeight;
                        originWidth = targetWidth;
                        originHeight = originWidth / scale;
                    }
                    // 非
                    else {
                        scale = originWidth / originHeight;
                        originHeight = targetHeight;
                        originWidth = originHeight * scale;
                    }
                    // 計(jì)算偏移量
                    const offsetX = - (originWidth - targetWidth) / 2
                    const offsetY = - (originHeight - targetHeight) / 2
                    // 清空畫布
                    ctx.clearRect(0, 0, canvas.width, canvas.height)

                    // 繪制圖片
                    ctx.drawImage(tempImage, offsetX, offsetY, originWidth, originHeight)
                    const base64 = canvas.toDataURL() // canvas輸出base64
                    const fs = wx.getFileSystemManager(); // 獲取獲取全局唯一的文件管理器
                    const filePath = wx.env.USER_DATA_PATH + '/tmp.png'; // 寫入臨時(shí)路徑
                    fs.writeFile({
                        filePath,
                        data: base64.replace(/^data:image\/\w+;base64,/, ""), // 剔除base64特有前綴
                        encoding: 'base64',
                        success: (res) => {
                            wx.saveImageToPhotosAlbum({ // 保存到手機(jī)相冊(cè)
                                filePath,
                                success: (res) => {
                                    wx.showToast({
                                        title: '保存成功',
                                    })
                                }
                            })
                        }
                    });
                }
            }
        })
    },
    error(e) {
        console.log(e.detail)
    }
})
源碼

https://developers.weixin.qq.com/s/DxGSlEmD7wCu

拓展

處理圖片的顏色值

index.js 節(jié)選文章來源地址http://www.zghlxwxcb.cn/news/detail-487791.html

// 繪制圖片
ctx.drawImage(tempImage, offsetX, offsetY, originWidth, originHeight)
// getImageData 
// 按照從左到右,從上到下的順序去存儲(chǔ)像素點(diǎn)信息
// 每四個(gè)數(shù)組元素代表了一個(gè)像素點(diǎn)的RGBA信息
const imageData = ctx.getImageData(0, 0, originWidth, originHeight)
// 灰度范圍
const minGray = 230;
// 目標(biāo)色
const white = 255;
for (let i = 0; i < imageData.data.length; i += 4) {
    let tmpRed = imageData.data[i]
    let tmpGreen = imageData.data[i + 1]
    let tmpBlue = imageData.data[i + 2]
    let tmpAlpha = imageData.data[i + 3]
    if (tmpRed > minGray && tmpGreen > minGray && tmpBlue > minGray && tmpAlpha > minGray) {
        imageData.data[i] = white;
        imageData.data[i + 1] = white;
        imageData.data[i + 2] = white;
        imageData.data[i + 3] = white;
    }
}
ctx.putImageData(imageData, 0, 0)

到了這里,關(guān)于微信小程序 Canvas裁切案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微信小程序 新版canvas繪制圖片方法

    截至2022.12.23 修改日 微信小程序開發(fā)文檔介紹不全,導(dǎo)致很多用戶繪制圖片不顯示或失敗,因此寫下截至目前的可行方案 如果新手不熟悉canvas,先看下小程序官方文檔 可運(yùn)行案例: wxml: js:

    2024年02月12日
    瀏覽(23)
  • 微信小程序新版canvas繪制圖片方法

    今天在做項(xiàng)目使用到了canvas繪制二維碼,發(fā)現(xiàn)以前的方法被棄用了。 wxml: 如果想要繪制需要將起臨時(shí)存儲(chǔ)起來,寫入成功的就可以進(jìn)行繪制了。(如果是點(diǎn)擊展示二維碼,最好是先將數(shù)據(jù)寫到onLoad事件中,在將要繪制的東西寫到點(diǎn)擊事件中去,在點(diǎn)擊事件中去獲取數(shù)據(jù));

    2024年02月11日
    瀏覽(29)
  • 微信小程序?qū)崿F(xiàn)canvas畫圓形微信頭像

    微信小程序?qū)崿F(xiàn)canvas畫圓形微信頭像

    1.需要獲取用戶信息,拿到用戶頭像圖片 2.實(shí)例化一個(gè)canvas對(duì)象,繪制出圓形并將頭像固定到圓形中心位置 3.實(shí)現(xiàn)效果 ? ? ?

    2024年02月15日
    瀏覽(22)
  • 微信小程序使用canvas繪制網(wǎng)絡(luò)圖片,使用canvas將圖片變成圓形

    微信小程序使用canvas繪制網(wǎng)絡(luò)圖片,使用canvas將圖片變成圓形

    以上的寫法 會(huì)造成某些圖標(biāo)無法繪制上去, 解決方法是在網(wǎng)絡(luò)圖片中不斷嵌套,先繪制大圖片,再繪制小圖片的順序 網(wǎng)上說使用先下載到本地,再使用img.src加載,我嘗試過還是不行 長(zhǎng)用在海報(bào),需要將用戶的頭像畫到canvas圖片上,如: 其原理就是在圖片上面放一個(gè)圓

    2024年02月13日
    瀏覽(33)
  • 微信小程序:使用canvas 生成圖片 并分享

    微信小程序:使用canvas 生成圖片 并分享

    廢話不多說直接上代碼!?。?! 最終效果圖 ?

    2024年02月11日
    瀏覽(92)
  • 微信小程序--canvas畫布實(shí)現(xiàn)圖片的編輯

    微信小程序--canvas畫布實(shí)現(xiàn)圖片的編輯

    上傳圖片,編輯圖片大小,添加文字,改變文字顏色等 微信小程序--canvas畫布實(shí)現(xiàn)圖片的編輯 軟件環(huán)境:微信開發(fā)者工具 官方下載地址:微信開發(fā)者工具下載地址與更新日志 | 微信開放文檔 1、基本需求。 實(shí)現(xiàn)上傳圖片 實(shí)現(xiàn)圖片編輯 實(shí)現(xiàn)添加文字 實(shí)現(xiàn)導(dǎo)出圖片 2、案例目錄

    2024年02月05日
    瀏覽(94)
  • 【微信小程序】解決canvas組件層級(jí)最高問題

    1、為什么canvas組件總是會(huì)在最上層? 因?yàn)閏anvas組件是由客戶端創(chuàng)建的原生組件, 原生組件層級(jí)是最高的 ,所以頁面中的其他組件無論設(shè)置 z-index 為多少都無法蓋在原生組件上 。 2、如何解決canvas層級(jí)最高問題?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wx

    2024年02月11日
    瀏覽(85)
  • 微信小程序canvas畫布不清晰解決方法

    繪制的圖片,文字等十分模糊 添加以下代碼,通過設(shè)置分辨率來解決 完整代碼: 模糊不清的時(shí)候 多多進(jìn)行調(diào)試一下就可以了 多嘗試新方案?

    2024年02月10日
    瀏覽(19)
  • uniapp 使用canvas畫海報(bào)(微信小程序)

    uniapp 使用canvas畫海報(bào)(微信小程序)

    效果展示: ?項(xiàng)目要求:點(diǎn)擊分享繪制海報(bào),并實(shí)現(xiàn)分享到好友,朋友圈,并保存 先實(shí)現(xiàn)繪制海報(bào) ? 下面是海報(bào)下面的分享彈窗 因?yàn)榉窒淼脚笥讶?shí)在沒找到有使用自定義按鈕的可能,所以還是需要點(diǎn)擊右上角膠囊 ? ?以上就是畫海報(bào)以及分享的全部過程了,另有一個(gè)點(diǎn):

    2024年02月13日
    瀏覽(100)
  • 微信小程序canvas畫圖案列,實(shí)現(xiàn)生成頭像并保存,小程序新版canvas變化,小程序中canvas注意事項(xiàng)

    微信小程序canvas畫圖案列,實(shí)現(xiàn)生成頭像并保存,小程序新版canvas變化,小程序中canvas注意事項(xiàng)

    你一定見過很多制作頭像的小程序,無論是國(guó)慶的紅旗,圣誕的帽子,還是疫情的口罩,都可以用小程序生成應(yīng)景的頭像,那么具體的代碼是怎么實(shí)現(xiàn)的呢?前些天幫別人做了一個(gè)生成姓氏頭像的功能,里面的實(shí)現(xiàn)原理基本一致,都是通過Canvas實(shí)現(xiàn),以生成姓氏頭像為例,記錄一下小程序的

    2024年02月09日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包