小程序圖片合成

引言

以前的同事說小程序合并生成圖片無法解決了立镶,今天解決不了老板讓滾蛋师逸。好吧司倚,本著人道主義精神,我花了半天時(shí)間幫它解決了篓像。順便記錄下幫助有需要的人动知。


需求分析

用戶可以選擇不同場(chǎng)景,每個(gè)場(chǎng)景有三個(gè)圖员辩。一張底色圖盒粮,一張二維碼圖,還有一張文字圖片奠滑。要求二維碼圖片可刪除丹皱,文字圖片可移動(dòng)。最后將三張圖片合成一張圖片宋税。

上代碼

首先我們將頁面分成兩塊.一塊為canvas用于合成圖片摊崭,一塊為view容器,處理文字圖片和二維碼圖片杰赛。

wxml

<view class="">

  <view class="canvasStyle" wx:if="{{cshow}}">

    <canvas canvas-id="myCanvas" 
disable-scroll="true"  id='canvas-container' />
    <view class="Canvas_Text">

      
    </view>

  </view>

  <view class='draw-content' wx:if="{{!cshow}}">
    <image src='{{img}}' class="look-image"></image>
    <view class='litlelooks-wrap' bindtouchmove="imagetouchmove" style='left:{{leftLooks}}px;top:{{topLooks}}px;'>
     
      <image class='litlelooks-image' src='{{text_img}}'></image>

     
    </view>

      <view class='code-image-wrap' wx:if="{{showClose}}">
     
         <image class='code-image' src='{{qrcode_img}}'></image>
      <image class='close' src="../../images/icon_close.png" bindtap='hideLooks'></image>
    </view>

  
  </view>
  <view class="chooseImage">

    <view class="Btn generateBtn">
      <button  catchtap='textreplace'>文字替換</button>
 
      <button catchtap="Okgenerate">編輯完成</button>

       <button catchtap="test">test</button>
    </view>

  </view>
</view>
wxss


.canvasStyle{width:690rpx;height:1035rpx;border:1rpx solid #000;margin:20rpx auto;position:relative;}
.Canvas_Text{width:690rpx;height:1035rpx;position:absolute;top:1px;left:1px;z-index:1;}
.Canvas_Text image{width:100%;height:100%;}
.canvasStyle canvas{width:100%;height:100%;margin:1px 0 0 1px; background:none;position:relative;z-index:10;}

.BtnImg_select{height:80rpx;line-height:80rpx;}
.BtnImg_select:active{color:#f1f1f1;background-color:#d95649;}
.Input_text{border:1rpx solid #e6e6e6;border-radius:6rpx;font-size:30rpx;height:80rpx;margin:0 0 20rpx 0;}
.Input_text input{width:90%;height:100%;padding:0 5% 0 5%;}
.generateBtn{padding:10rpx 0 10rpx 0;font-size:28rpx;}
.generateBtn button{
 width: 213rpx;
 height: 88rpx;
 
 border-radius: 44rpx;
 background-color: #6F91FF;
color: #fff;
line-height: 88rpx;

font-size: 30rpx;
  margin-left:14.5%;
  float: left;

}



.draw-content{
  width: 690rpx;
  height: 1035rpx;
 

  overflow: hidden;
  border: 1px solid #ccc;
  margin:20rpx auto;
  position:relative;
}
.look-image{
  width: 690rpx;
  height: 1035rpx;
}
.litlelooks-wrap{
  position: absolute;

}
.close{
  position: absolute;
  right: -20rpx;
  top: -20rpx;
  width: 38rpx;
  height:38rpx;
}
.litlelooks-image{
 
}

.code-image-wrap{
 position: absolute;
  width: 120rpx;
  height: 120rpx;
  left:550rpx;
  top:880rpx;
}
.code-image{
   width: 120rpx;
  height:120rpx;
}

js

const app = getApp()
const ctx = wx.createCanvasContext('myCanvas');
Page({
  data: {
    text_x: 40, //x軸
    text_y: 10, //y軸
    imageUrl: '', // 生成的圖片路徑
    canvasWidth: '',
    canvasheight: '',
    content: '',
    subtitle: '',
    data: null,
    qrcode_img: '',
    QRCodeWidth:60,
    textimgWidth: 300,
    textimgheight: 450,
    img: '',
    template_id:'',
    text_img:'',
    leftLooks: '20',
    topLooks: '20',
    showClose:true,
    cshow:false
 
   
  },
  onLoad: function (options) {
    var that = this;
    console.log(JSON.stringify(options.data)+"哈哈34");
    //  that.Editetask(options.template_id); 
    that.setData({
      data: JSON.parse(options.data),
      text_img: JSON.parse(options.data).text_img,
      qrcode_img: JSON.parse(options.data).qrcode_img,
      img: JSON.parse(options.data).img,
      sort_small_id: options.sort_small_id,
      template_id: JSON.parse(options.data).template_id
    });
   

  },

  hideLooks:function(){
    this.setData({
      showClose:false
    })
  },

  test:function(e){
  var that=this;
    wx.createSelectorQuery().select('#canvas-container').boundingClientRect(function (rect) {   
      that.setData({
        canvasWidth: rect.width,
        canvasheight: rect.height
      });

      that.dowloadimg();

    }).exec();
  },

//文字圖片移動(dòng)
  imagetouchmove: function (e) {
    var self = this;
    self.setData({
      leftLooks: e.touches[0].clientX - 60,
      topLooks: e.touches[0].clientY - 60
    })
  },

  //返回觸發(fā)事件
  returngo: function () {
    var that = this;
    that.dowloadimg();
  },
  //開始繪圖
  dowloadimg: function () {
    var that = this;
    console.log(that.data.data.img + "不會(huì)的");
    wx.getImageInfo({
      src: that.data.data.img, //請(qǐng)求的網(wǎng)絡(luò)圖片路徑
      success: function (res) {
        console.log(res.path+"背景圖片");
        that.setData({
          imageUrl: res.path,
        });
        ctx.drawImage(res.path, 0, 0, that.data.canvasWidth, that.data.canvasheight);
        ctx.draw();
        that.Drawtextimg();
        if (that.data.showClose){
          that.drawcode();
        }


    
      }
    })


  
  },
  //畫文字圖片
  Drawtextimg:function(){
    var that=this;
    var that = this;
    console.log(that.data.text_x + "進(jìn)入文本圖片");
    wx.getImageInfo({
      src: that.data.text_img, //請(qǐng)求的網(wǎng)絡(luò)圖片路徑
      success: function (res) {
        console.log(JSON.stringify(res) + "二維碼");
        ctx.drawImage(res.path, that.data.leftLooks, that.data.topLooks, that.data.textimgWidth/3*2, that.data.textimgheight/3*2);

        ctx.draw(true);
      }
    })

  },
//畫二維碼
  drawcode: function () {
    var that = this;
    console.log("hahaahh1");
    wx.getImageInfo({
      src: that.data.qrcode_img, //請(qǐng)求的網(wǎng)絡(luò)圖片路徑
      success: function (res) {
        console.log(JSON.stringify(res) + "二維碼");
        ctx.drawImage(res.path, that.data.canvasWidth - 20 - that.data.QRCodeWidth, that.data.canvasheight - that.data.QRCodeWidth - 20, that.data.QRCodeWidth, that.data.QRCodeWidth);
        ctx.draw(true);
        
      }
    })

  },




  textreplace: function () {
    var that = this;
    console.log(that.data.sort_small_id +"that.data.sort_small_id1");
    if (that.data.data != '' || that.data.data != null) {
      wx.navigateTo({
        url: '/pages/Ps_touch/text_replace?sort_small_id=' + that.data.sort_small_id,
      })
    }
  },

  edite:function(){
    var that=this;
    var ctx = wx.createCanvasContext('myCanvas');
    wx.createSelectorQuery().select('#canvas-container').boundingClientRect(function (rect) {
      that.setData({
        canvasWidth: rect.width,
        canvasheight: rect.height
      });

      wx.getImageInfo({
        src: that.data.text_img, //請(qǐng)求的網(wǎng)絡(luò)圖片路徑
        success: function (res) {
          console.log(JSON.stringify(res) + "二維碼123");
          ctx.drawImage(res.path, that.data.text_x, that.data.text_y, that.data.textimgWidth / 3 * 2, that.data.textimgheight / 3 * 2);

          ctx.draw(true);
        }
      })

    }).exec();
  },
//合成圖片
  Okgenerate: function () {

this.setData({
  cshow:true
})

    wx.showLoading({
      title: '正在合成圖片..',
    });
    var that = this;


    wx.createSelectorQuery().select('#canvas-container').boundingClientRect(function (rect) {
      that.setData({
        canvasWidth: rect.width,
        canvasheight: rect.height
      });

      that.dowloadimg();

    }).exec();
    setTimeout(function(){
      wx.canvasToTempFilePath({
        x: 0,
        y: 0,
        width: 380,
        height: 570,
        destWidth: 760,
        destHeight: 1140,
        quality: 1,
        canvasId: 'myCanvas',
        success: function (res) {
          console.log(JSON.stringify(res) + "圖片地址");
          wx.hideLoading();
          wx.navigateTo({
            url: '/pages/task/editefinish?img=' + res.tempFilePath + "&template_id=" + that.data.template_id,
          });


        }
      })
    },3000)

  
    
  },
  
})

結(jié)束

代碼都已貼上爽室。主要的方法已添加注釋。不過我也有個(gè)疑問,在最后的合成時(shí)阔墩,需要延遲幾秒才會(huì)得到圖片嘿架,否則一直無法獲取合成圖片。也望大神們指點(diǎn)迷津啸箫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耸彪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忘苛,更是在濱河造成了極大的恐慌蝉娜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扎唾,死亡現(xiàn)場(chǎng)離奇詭異召川,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)胸遇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門荧呐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纸镊,你說我怎么就攤上這事倍阐。” “怎么了逗威?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵峰搪,是天一觀的道長。 經(jīng)常有香客問我凯旭,道長概耻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任罐呼,我火速辦了婚禮咐蚯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弄贿。我一直安慰自己,他們只是感情好矫膨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布差凹。 她就那樣靜靜地躺著,像睡著了一般侧馅。 火紅的嫁衣襯著肌膚如雪危尿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天馁痴,我揣著相機(jī)與錄音谊娇,去河邊找鬼。 笑死罗晕,一個(gè)胖子當(dāng)著我的面吹牛济欢,可吹牛的內(nèi)容都是我干的赠堵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼法褥,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼茫叭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起半等,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤揍愁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后杀饵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莽囤,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年切距,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朽缎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔚舀,死狀恐怖饵沧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赌躺,我是刑警寧澤狼牺,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站礼患,受9級(jí)特大地震影響是钥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缅叠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一悄泥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肤粱,春花似錦弹囚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庶骄,卻和暖如春毁渗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背单刁。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工灸异, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓肺樟,卻偏偏與公主長得像檐春,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儡嘶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355