91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信小程序如何利用Canvas繪制圖片和豎排文字

發布時間:2021-05-19 10:28:48 來源:億速云 閱讀:417 作者:小新 欄目:web開發

這篇文章主要介紹微信小程序如何利用Canvas繪制圖片和豎排文字,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

正文

首先放一張最終保存到相冊的圖片吧~

微信小程序如何利用Canvas繪制圖片和豎排文字

自我感覺良好,至少達到了我自己的預期吧~~~

下面讓我們一步一步來看看如何實現的吧。

整個圖片分為三個部分:

  • 武將圖片

  • 小程序碼

  • 武將文字信息

先來看一下 wxml 里面的代碼,主要是放了一個 canvas 標簽,控制了一下高度和寬度屬性。

<view>
<canvas class='share-canvas'  canvas-id="share_canvas"></canvas>
</view>

武將圖片

drawHeroImage: function (path) {
var that = this;
// 拿到canvas context
let ctx = wx.createCanvasContext('share_canvas');
// 為了保證圖片比例以及繪制的位置,先要拿到圖片的大小
wx.getImageInfo({
src: path,
success: function (res) {
// 計算圖片占比信息 
let maxWidth = Math.min(res.width, that.data.canvasWidth * 0.65);
let radio = maxWidth / res.width;
let offsetY = (that.data.canvasHeight - res.height * radio) / 2;
console.log('offsetY=' + offsetY);
that.setData({
imageWidth: res.width * radio,
imageHeight: res.height * radio,
offsetY: offsetY,
});
// 繪制canvas背景,不屬于繪制圖片部分
ctx.setFillStyle('white')
ctx.fillRect(0, 0, that.data.canvasWidth, that.data.canvasHeight);
// 繪制武將圖片,path是本地路徑,不可以傳網絡url,如果是網絡圖片需要先下載
ctx.drawImage(path, 10, offsetY, res.width * radio, res.height * radio)
// 繪制小程序碼
that.drawQrCodeImage(ctx);
// 繪制勢力漢字:吳
that.drawInfluence(ctx, that.data.hero.HERO.INFLUENCE);
// 繪制武將姓名:陸遜
that.drawName(ctx, that.data.hero.HERO.NAME);
// 繪制武將稱號:江陵侯
that.drawHorner(ctx, that.data.hero.HERO.HORNER);
// 最終調用draw函數,生成預覽圖
// 一個坑點:只能調用一次,否則后面的會覆蓋前面的
ctx.draw();
}
});
}

小程序碼

小程序碼和武將圖片是一個類型,無非就是需要計算繪制的位置,這里就不再展示相關代碼了。

武將文字信息

從剛剛的代碼可以看出,我分了3個部分來繪制,其實 吳 和 陸遜 應該是可以放到一起的,但是我在繪制的時候發現,空格在繪制的時候會引起異常,導致空格后面的文字無法繪制出來,所以我這里 吳 和 陸遜 中間的空白是靠位置偏移來做的。

這里就展示一下如何繪制武將稱號的。

// 繪制武將稱號:江陵侯
drawHorner: function (ctx, text) {
// 設置字號
ctx.setFontSize(26);
// 設置字體顏色
ctx.setFillStyle("#000000");
// 計算繪制起點
let x = this.data.offsetX + 35;
let y = this.data.offsetY + 10;
console.log('drawHorner' + text);
console.log(x);
console.log(y);
// 繪制豎排文字,這里是個Util函數,具體實現請繼續看
Canvas.drawTextVertical(ctx, text, x, y);
}

繪制豎排文字從網上找了個開源的代碼,需要看原理的請看這里

當然我這里為了適用小程序做了些改動,函數原型是這樣子的:

CanvasRenderingContext2D.prototype.letterSpacingText = function (text, x, y, letterSpacing)

原諒我不是很會 js ,完全不懂這是個什么語法,看了一會沒弄懂,感覺像是給類添加新的屬性,不管他。

不管白貓黑貓,能抓到耗子就是好貓

改造后的函數像下面的樣子:

canvas.js 
/**
* @author zhangxinxu(.com)
* @licence MIT
* @description http://www.zhangxinxu.com/wordpress/?p=7362
*/
function drawTextVertical(context, text, x, y) {
var arrText = text.split('');
var arrWidth = arrText.map(function (letter) {
return 26;
// 這里為了找到那個空格的 bug 做了許多努力,不過似乎是白費力了
// const metrics = context.measureText(letter);
// console.log(metrics);
// const width = metrics.width;
// return width;
});
var align = context.textAlign;
var baseline = context.textBaseline;
if (align == 'left') {
x = x + Math.max.apply(null, arrWidth) / 2;
} else if (align == 'right') {
x = x - Math.max.apply(null, arrWidth) / 2;
}
if (baseline == 'bottom' || baseline == 'alphabetic' || baseline == 'ideographic') {
y = y - arrWidth[0] / 2;
} else if (baseline == 'top' || baseline == 'hanging') {
y = y + arrWidth[0] / 2;
}
context.textAlign = 'center';
context.textBaseline = 'middle';
// 開始逐字繪制
arrText.forEach(function (letter, index) {
// 確定下一個字符的縱坐標位置
var letterWidth = arrWidth[index];
// 是否需要旋轉判斷
var code = letter.charCodeAt(0);
if (code <= 256) {
context.translate(x, y);
// 英文字符,旋轉90°
context.rotate(90 * Math.PI / 180);
context.translate(-x, -y);
} else if (index > 0 && text.charCodeAt(index - 1) < 256) {
// y修正
y = y + arrWidth[index - 1] / 2;
}
context.fillText(letter, x, y);
// 旋轉坐標系還原成初始態
context.setTransform(1, 0, 0, 1, 0, 0);
// 確定下一個字符的縱坐標位置
var letterWidth = arrWidth[index];
y = y + letterWidth;
});
// 水平垂直對齊方式還原
context.textAlign = align;
context.textBaseline = baseline;
}
module.exports = {
drawTextVertical: drawTextVertical
}

繪制網絡圖片

由于網絡圖片無法直接繪制,所以需要先下載到本地,然后再按住本地圖片繪制的流程走一遍。

downloadHeroImage: function () {
// 微信不支持非https的圖片下載,這里了個替換
let url = this.data.hero.HERO.ICON.replace(/http/, "https");
var that = this;
wx.downloadFile({
url: url,
success: function (res) {
// 下載成功后拿到圖片的路徑,然后開始繪制
var path = res.tempFilePath;
that.drawHeroImage(path);
}, fail: function (res) {
console.log(res)
}
});
}

保存圖片

說了這么多,自然少不了最終的一步,將繪制到 canvas 的圖片保存到手機相冊,這里需要用戶授權,你需要自己處理。
用的是微信給我們提供的接口 wx.canvasToTempFilePath 。需要我們傳入起點坐標 (x, y)和畫布大小 (width, height) 以及 canvasId 。

saveShareImage: function () {
wx.showLoading({
title: '正在保存圖片..',
});
let that = this;
wx.canvasToTempFilePath({
x: 0,
y: 0,
width: that.data.canvasWidth,
height: that.data.canvasHeight,
canvasId: 'share_canvas',
success: function (res) {
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success(res) {
console.log(res);
wx.showToast({
title: '保存到相冊成功',
duration: 1500,
})
},
fail(res) {
console.log(res)
wx.showToast({
title: '保存到相冊失敗',
icon: 'fail'
})
},
complete(res) {
console.log(res)
}
})
}
})
}

以上是“微信小程序如何利用Canvas繪制圖片和豎排文字”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石河子市| 乾安县| 兰西县| 平塘县| 石家庄市| 淄博市| 南漳县| 鹿泉市| 吉林市| 阿克| 景宁| 泸州市| 北安市| 观塘区| 宁明县| 萍乡市| 安国市| 湖南省| 娱乐| 宜城市| 临洮县| 安远县| 舟曲县| 长治县| 罗甸县| 朝阳区| 满洲里市| 沐川县| 新源县| 新巴尔虎左旗| 昔阳县| 桃园县| 隆林| 蓝田县| 社会| 鹤庆县| 壤塘县| 平舆县| 庆云县| 探索| 珠海市|