精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

國慶微信頭像DIY:輕松打造個性化頭像!

開發 前端
國慶節馬上要到了,今天就教你如何從0到1使用canvas生成國慶風微信頭像。

前言

國慶節馬上要到了,今天就教你如何從0到1使用canvas生成國慶風微信頭像。

本文包含以下內容:

  • vue3項目搭建,需求分析
  • canvas合成圖片原理
  • github自動化部署
  • 開發過程遇到的問題及解決方案

搭建項目,分析需求

項目的話就直接使用腳手架生成一個 Vue3 + TS項目

npm create vue@latest

為了方便,使用了Element PlusUI庫

npm install element-plus --save

配置的話,可以查看文檔,全局導入、按需導入都可以看自己的需求

項目搭建完后,就可以來分析一下本次需求大概會涉及哪些功能了

  • 上傳頭像

這是一個合成微信頭像的工具,那就必須得讓用戶上傳自己的微信頭像了

  • 合成模版

為了方便,我們當然還需要提供多種模版供用戶自己選擇

  • 用戶自定義內容

為了讓生成的頭像更具獨一無二性,我們還需要提供用戶自定義內容的功能,比如:用戶輸入文字、選擇文字顏色等

  • 合成頭像

本次需求的重點當然是合成頭像了

  • 下載合成后的頭像

用戶合成完當然還得支持讓他下載

功能開發

上傳頭

<script setup lang="ts">
// 用戶頭像
const user_img = ref("");
const change = (file: any, fileList: any) => {
  console.log(file, fileList);
  const fileReader = new FileReader();
  fileReader.readAsDataURL(file.raw);
  fileReader.onload = (e: any) => {
    user_img.value = e.target.result;
  };
};

// 刪除用戶頭像
const remove = () => {
  user_img.value = "";
};
</script>

這部分比較簡單,主要是用戶上傳自己的微信頭像后再進行展示,UI部分就不貼了,后面有源碼。

合成模版

合成模版部分,這里主要是需要考慮各個模版所需要的合成功能有哪些

<script>
const gqList = ref([
  {
    id: 1,
    name: "模版1",
    img: getImg("gq0", "jpg"),
    template: getImg("tem1"),
    has: ["text"],
    textLabel: "請輸入你的姓",
    desc: "最多輸入1個字",
    text: "宋",
    textLength: 1,
  },
  {
    id: 2,
    name: "模版2",
    img: getImg("gq1", "jpg"),
    template: getImg("tem2"),
  },
  {
    id: 3,
    name: "模版3",
    img: getImg("gq2", "jpg"),
    template: getImg("tem3"),
  },
  {
    id: 4,
    name: "模版4",
    img: getImg("gq3", "jpg"),
    template: getImg("tem4"),
    has: ["text"],
    textLabel: "請輸入祝福語",
    textColor: "#FED800",
    text: "生在國旗下,長在春風里",
    desc: "最多輸入12個字, 請用中文逗號隔開",
    textLength: 12,
  },
  { id: 5, name: "模版5", img: getImg("gq4"), template: getImg("tem5") },
  {
    id: 6,
    name: "模版6",
    img: getImg("gq5", "jpg"),
    template: getImg("tem6"),
    has: ["text"],
    textLabel: "請輸入祝福語",
    textColor: "#FED800",
    desc: "最多輸入12個字, 請用中文逗號隔開",
    text: "不負韶華,只爭朝夕",
    textLength: 12,
  },
  { id: 7, name: "模版7", img: getImg("gq6"), template: getImg("tem7") },
]);
const template_id = ref(1);
// 選擇模版
const gqChange = (val: any) => {
  console.log(val);
  template_id.value = val;
  generateImgRef.value.clear();
  generateImgRef.value.init();
};
</script>

合成圖片

這里其實也不難,主要是使用canvas來繪制圖片以及文字,由于各個模版的合成邏輯不一樣,這里就不全部展示了,但整體上的合成流程是一樣

// 模版4
const drawImg4 = (ctx: any) => {
  const img = new Image();
  img.src = user_img.value;
  const gqImg = new Image();
  gqImg.src = gqList.value[template_id.value - 1].img;
  img.onload = () => {
    ctx.drawImage(img, 0, 0, 300, 300); // 繪制頭像
    gqImg.onload = () => {
      ctx.drawImage(gqImg, 0, 0, 300, 300); // 繪制國慶圖
      ctx.fillStyle = textColor.value; // 設置文字顏色
      ctx.font = "20px kaiti"; // 設置文字大小及字體
      const textList = text.value?.split(",") ?? []; // 以中文逗號分割文字
      textList.forEach((item: string, i: number) => {
        drawVerticalText(ctx, item ?? "", 20 + i * 20, 186 + i * 20, {
          size: 20,
        }); // 繪制文字
      });
    };
    canDownload.value = true; // 合成完成
  };
};

這里主要的難點在于canvas默認不支持文字豎排繪制,所以這里需要特殊處理,原理其實就是遍歷文字,計算文字高度,然后再一個一個去繪制

// 文字豎排
const drawVerticalText = (
  context: any,
  text: string,
  x: number,
  y: number,
  font: any
) => {
  context.save();
  context.font = font;
  for (var i = 0; i < text.length; i++) {
    context.fillText(text[i], x, y + i * font.size);
  }
  context.restore();
};

下載圖片

這里主要是借助a標簽的download屬性,這里在手機上有點坑,后面會提到...

const downloadImg = () => {
  if (!canDownload.value) {
    ElMessage({
      message: "請先合成頭像~",
      type: "warning",
    });
    return;
  }

  const url = canvas.value.toDataURL("image/png");
  const a = document.createElement("a");
  a.href = url;
  a.download = "國慶頭像.png";
  a.click();
};

自動化部署

這里其實之前有寫過文章,主要是使用github action來完成。

搭建完就是這樣的,我們寫完代碼只需要將代碼提交上去就能夠自動打包部署了

對這個不了解的可以去看我之前的文章:使用GitHub Actions實現自動化部署

體驗

開發部署完就可以來體驗一下了

PC上體驗下來,效果還可以。

問題及解決方案

開發過程中也遇到一些問題,來看看是如何解決的吧

保存圖片不清晰

canvas繪制圖片不清晰的原因主要是:

  • 圖片被放大或縮小
  • 圖片沒處于完整像素的位置

因為canvas是點陣圖,由一個個像素組成,當圖像被放大時,一個像素會被強形拉伸至一個以上,多出來的像素均勻的分部在圖像中,計算機為了使拉伸后的圖像看起來平滑,會給這些多出來的像素計算出一個過渡色,縮小圖像時,多個像素合成一個像素,計算機會用這多個像素的色彩值計算出一個過渡色來填充這個像素,不管是放大還是縮小,都會造成圖像原有像素信息丟失。

所以只需要加上以下代碼就能解決

const dpr = window.devicePixelRatio || 1; // 獲取設備的devicePixelRatio
canvas.value.width = 300 * dpr; // 畫布寬高放大dpr倍,繪制后再縮小dpr倍,解決模糊問題
canvas.value.height = 300 * dpr; // 畫布寬高放大dpr倍,繪制后再縮小dpr倍,解決模糊問題
canvas.value.style.width = "300px"; // 顯示高
canvas.value.style.height = "300px"; // 顯示高
ctx.value.scale(dpr, dpr); // 按比例縮放畫布,解決模糊問題

優化完,清晰度提升還是非常明顯的

移動端體驗問題

手機上下載圖片會失敗,這主要是因為blob格式在手機上不能下載,base64格式有點大,那就只能上傳CDN再進行下載了?

不需要,我們可以利用手機上的長按圖片保存來實現

const downloadImg = () => {
  if (!canDownload.value) {
    ElMessage({
      message: "請先合成頭像~",
      type: "warning",
    });
    return;
  }

  const url = canvas.value.toDataURL("image/png");
  if (devices.some((item) => ua.includes(item))) {
    ElMessageBox.alert(
      `
    請長按圖片保存
    <img src="${url}" style="width: 100%;height: 100%;object-fit: contain;" />
    `,
      "保存圖片",
      {
        dangerouslyUseHTMLString: true,
      }
    );
    return;
  }
  const a = document.createElement("a");
  a.href = url;
  a.download = "國慶頭像.png";
  a.click();
};

圖片

打包部署問題

打包生成的_plugin-vue_export-helper.cdc0426e.js文件訪問404,剛開始我還以為是打包路徑配置的有問題,但如果是打包路徑的問題的話也不會只有這一個文件有問題。

最終,我在vite的issues中找到了答案

簡單點講就是Github Pages 阻止了以下劃線字符開頭的文件,所以會導致這個文件訪問返回404。

解決方法就是修改打包邏輯:

const INVALID_CHAR_REGEX = /[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g;
const DRIVE_LETTER_REGEX = /^[a-z]:/i;

build: {
    outDir: "dist",
    assetsDir: "assets",
    chunkSizeWarningLimit: 2000, // 解決包大小超過500kb的警告
    rollupOptions: {
      output: {
        manualChunks: {
          // elementPlus: ["element-plus"],
          // highlightjs: ["highlight.js"],
        },
        chunkFileNames: "assets/[name]-[hash].js",
        entryFileNames: "assets/[name]-[hash].js",
        assetFileNames: "assets/[name]-[hash].[ext]",
        sanitizeFileName: (name) => {
          const match = DRIVE_LETTER_REGEX.exec(name);
          const driveLetter = match ? match[0] : "";
          return (
            driveLetter +
            name.slice(driveLetter.length).replace(INVALID_CHAR_REGEX, "") // 處理文件名中的非法字符
          );
        },
      },
    },
  },

vite.config.ts中加上以上代碼,重新提交部署就可以了。

最后

整個內容到這里就結束了

體驗地址:https://bettersong.github.io/nanjiu-tools/#/generate_image

責任編輯:華軒 來源: 前端南玖
相關推薦

2023-09-29 11:32:07

2025-02-04 11:18:49

Spring安全應用

2011-08-18 18:53:30

win7

2023-06-16 08:00:00

語音助手GPTWhisper

2019-09-25 08:26:20

Python微信頭像

2012-09-24 17:15:57

傲游瀏覽器

2022-09-30 15:02:06

Python國慶紅旗

2020-06-28 07:00:00

推薦系統智能商務服務平臺

2024-10-05 00:00:25

Cursor網站代碼

2022-03-02 14:31:00

微信來電移動應用

2023-10-17 08:42:13

ChatGPT定制指令

2022-11-01 07:19:45

推薦系統非個性化

2024-03-25 07:57:10

ChatGPTPromote人工智能

2025-02-11 10:30:00

2014-12-19 10:02:33

華為智慧城市

2011-01-20 10:19:21

PowerShell個性化

2021-10-31 08:52:34

微信電腦版騰訊

2015-04-17 15:36:50

Teradata數字化

2010-01-11 17:41:26

MXN旅游頻道

2014-07-30 12:08:04

微盟
點贊
收藏

51CTO技術棧公眾號

中文字幕乱码无码人妻系列蜜桃| 三上悠亚 电影| 麻豆视频在线| 国产精品一级片| 欧美美女操人视频| 亚洲最大免费视频| 日韩综合久久| 香蕉影视欧美成人| 三区精品视频| 亚洲av综合色区无码一区爱av| 影音先锋久久资源网| 亚洲人精品午夜在线观看| 天堂中文av在线| 蜜桃视频在线观看免费视频| 国产精品丝袜一区| 国产成人成网站在线播放青青| 特级做a爱片免费69| 不卡一区综合视频| 亚洲国产成人久久综合| 簧片在线免费看| 成人av影院在线观看| 久久久久99精品一区| 超碰97在线播放| 亚洲黄网在线观看| 黄色精品网站| 日韩色av导航| 黄免费在线观看| 一区二区日韩| 欧美精品99久久久**| 亚洲 欧美 综合 另类 中字| porn视频在线观看| 99riav一区二区三区| 亚洲精品女av网站| 亚洲一级特黄毛片| 午夜在线a亚洲v天堂网2018| 欧美黑人视频一区| 亚洲最大的黄色网址| 激情婷婷综合| 亚洲欧美日本精品| 成人午夜精品无码区| 国内精品视频| 在线播放91灌醉迷j高跟美女| 999香蕉视频| 高潮在线视频| 精品久久久久久中文字幕一区奶水 | 日本一本中文字幕| 黄色在线视频网站| 中文字幕在线不卡视频| 日韩在线三级| av在线电影免费观看| 久久精品视频在线免费观看| 精品日产一区2区三区黄免费| 亚洲精品无遮挡| 国产成人精品影视| 91网免费观看| 亚洲成人777777| 成人三级伦理片| 国产v亚洲v天堂无码| 亚洲狼人综合网| 丰满少妇久久久久久久| 国产高清自拍99| 亚洲大尺度网站| 成人的网站免费观看| 国产精品国产三级欧美二区 | 黄瓜视频免费观看在线观看www| 国产女人在线观看| 国产精品日韩精品欧美在线 | 欧美日本久久| 色在人av网站天堂精品| 欧美精品入口蜜桃| 国产精品第十页| 久久青草福利网站| 欧美一区二区激情视频| 老牛国产精品一区的观看方式| 日本aⅴ大伊香蕉精品视频| 最新中文字幕一区| 日本中文字幕一区二区有限公司| 国产精品十八以下禁看| 96日本xxxxxⅹxxx17| 国内精品在线播放| 成人精品一二区| 欧美在线精品一区二区三区| 久久这里只有精品6| 日韩一区二区三区资源| 日韩子在线观看| 一区二区三区精品在线观看| 人人干视频在线| 日本成人三级电影| 欧美日韩国产精品自在自线| 91丝袜超薄交口足| 国产欧美自拍一区| 深夜福利一区二区| 欧美精品成人久久| 视频精品一区二区| 51成人做爰www免费看网站| 天天爽夜夜爽夜夜爽| 国产喂奶挤奶一区二区三区 | 国产日韩亚洲欧美精品| 国产不卡在线观看| 精品国产免费无码久久久| 94色蜜桃网一区二区三区| 视频一区视频二区视频三区视频四区国产 | 伊人久久噜噜噜躁狠狠躁| 精品视频久久久久久久| 久久国产精品国语对白| 亚洲二区在线| 国产欧美一区二区三区久久人妖 | 正在播放亚洲1区| 国产一级生活片| 男人的天堂亚洲一区| 国产精品一区二区免费看| 91精彩视频在线播放| 疯狂欧美牲乱大交777| 亚洲欧美手机在线| 午夜欧洲一区| 欧美精品成人在线| 国产强伦人妻毛片| 欧美激情中文字幕一区二区| 婷婷无套内射影院| 美国十次综合久久| 中文字幕国产日韩| 国产精品久久久久久久久久精爆| 国产精品一区二区果冻传媒| 日韩久久在线| 在线女人免费视频| 亚洲国产精品999| 天天看片中文字幕| 免费观看日韩av| 欧美精品一区二区三区久久| 爱情岛亚洲播放路线| 91精品国产综合久久久久久久| 欧美做受高潮6| 在线视频精品| 国产伦理久久久| 欧美人与禽猛交乱配| 欧美日本一道本在线视频| 亚洲综合色一区| 国产日韩欧美高清免费| 久久99精品久久久久久水蜜桃| 怡红院在线播放| 欧美一三区三区四区免费在线看| 五月婷婷婷婷婷| 捆绑紧缚一区二区三区视频| 欧美一区二区三区在线播放 | 美洲精品一卡2卡三卡4卡四卡| 欧美日韩国产一区| 五月天婷婷丁香网| 蜜臀精品一区二区三区在线观看 | 我要看一级黄色录像| 久久一区亚洲| 奇米888一区二区三区| 丁香六月综合| 亚洲午夜av电影| 国产一区福利视频| 亚洲最大的黄色网| 影音先锋在线一区| 国产厕所精品在线观看| 福利小视频在线| 欧美不卡激情三级在线观看| 欧美三级在线免费观看| 国产宾馆实践打屁股91| 国产片侵犯亲女视频播放| 91久久精品无嫩草影院| 久久久久久久一| 熟妇高潮一区二区三区| 色综合中文综合网| 特级西西人体高清大胆| 精品一区二区三区免费毛片爱| 一区二区三区av| 国内不卡的一区二区三区中文字幕| 成人444kkkk在线观看| 亚洲第一色网站| 欧美小视频在线| 欧美一区二区三区观看| 欧美美女在线直播| 91麻豆6部合集magnet| 亚洲熟妇无码另类久久久| 全国精品免费看| 国产不卡精品视男人的天堂| 五月婷婷在线观看| 欧美r级在线观看| www.com国产| 国产精品免费丝袜| 欧美一级大片免费看| 国产欧美一级| 亚洲一区三区| 亚洲精品在线a| 日本高清久久天堂| 国产精品剧情一区二区在线观看 | 国产a∨精品一区二区三区不卡| av天在线观看| 欧美精品一区二| 怡红院成永久免费人全部视频| 亚洲天天做日日做天天谢日日欢| 亚洲精品第二页| 日本vs亚洲vs韩国一区三区 | 欧美高清一区二区| 亚洲网站三级| 欧美一区二区视频97| 视频一区二区三区不卡| 亚洲第一偷拍网| 在线免费看毛片| 午夜精品福利一区二区蜜股av | 国产精品吹潮在线观看| 污视频在线免费观看网站| 亚洲女同性videos| 亚洲av无码专区在线| 欧美视频一区二区三区| 日韩黄色三级视频| 亚洲乱码精品一二三四区日韩在线| 少妇精品一区二区| 国产盗摄精品一区二区三区在线 | 99久久精品免费观看| 第一区免费在线观看| 9色精品在线| 国产资源第一页| 色婷婷一区二区三区| 欧美日韩一区二区三| 在线观看视频一区二区三区| 国产精品视频yy9099| 女海盗2成人h版中文字幕| 欧美乱大交xxxxx| 免费大片黄在线| 亚洲天堂影视av| 亚洲av成人精品日韩在线播放| 欧美一级xxx| 艳妇乳肉豪妇荡乳av| 色美美综合视频| 欧美一级片免费在线观看| 亚洲一二三四区不卡| 综合五月激情网| 国产精品久久久久久亚洲毛片| 波多野结衣先锋影音| 成人黄色a**站在线观看| 四虎国产精品免费| 国产一区二区三区在线观看精品| 国内自拍视频一区| 丝袜诱惑制服诱惑色一区在线观看 | 日韩精品电影在线| 久久久久国产精品熟女影院| 9久re热视频在线精品| 霍思燕三级露全乳照| 亚洲视频综合| 阿v天堂2017| 日韩视频在线一区二区三区 | 奇米影视7777精品一区二区| 国产精品无码av无码| 丝袜美腿高跟呻吟高潮一区| 蜜臀av午夜一区二区三区 | 热门国产精品亚洲第一区在线| 麻豆视频在线看| 91高清免费在线观看| 麻豆mv在线看| 日本久久中文字幕| 免费观看成人性生生活片 | 美女av一区| 国产在线精品一区二区中文| 久久精品国产亚洲blacked| 久久伊人一区| 成人精品影院| 亚洲免费视频播放| 国产中文一区| 免费看一级大黄情大片| 久久久青草婷婷精品综合日韩| 成人一级片网站| 免费在线观看成人| 亚洲精品第三页| 懂色av一区二区在线播放| 中文字幕在线观看网址| 国产日韩精品久久久| 永久免费看片视频教学| 亚洲综合一二三区| 精品人妻一区二区三区免费看| 欧美图片一区二区三区| 国产欧美熟妇另类久久久| 亚洲国产中文字幕在线观看| 久久久久久青草| 日韩一区二区久久久| 欧美寡妇性猛交xxx免费| 茄子视频成人在线| 伊人国产精品| 国产伦精品一区二区三区视频孕妇| 国产亚洲一区二区三区啪 | 国产欧美日韩综合一区在线播放| wwwwww.色| 国产成人av一区| 先锋影音av在线| 亚洲最新在线观看| 国产精品欧美综合| 欧美大片国产精品| 福利小视频在线观看| 欧美精品aaa| 成人mm视频在线观看| 国产精品区一区二区三在线播放| 精品国产一区二区三区av片| 国产一级大片免费看| 日韩高清不卡在线| 中文字幕一区二区三区人妻在线视频| 久久九九全国免费| 国产亚洲欧美精品久久久久久| 欧美在线短视频| 少妇高潮一区二区三区99小说| 日韩中文娱乐网| 美女100%一区| 国产传媒一区二区三区| 99精品在线观看| 成人观看免费完整观看| 国产91精品在线观看| 中文字幕第69页| 91久久精品午夜一区二区| 成人毛片在线精品国产| 久久精品91久久久久久再现| 亚洲天堂一区二区| 国产专区一区二区| 亚洲理论电影网| 邪恶网站在线观看| 久久久久久免费毛片精品| 日韩成人免费在线视频| 欧美α欧美αv大片| 国产原创精品视频| 国产精品视频xxxx| 欧美日韩一区二区综合 | 欧美粗大gay| 精品乱码一区| 极品日韩av| 四虎国产精品免费| 一区二区三区蜜桃| 国产99999| 久久视频在线视频| 亚洲精品aaa| 一区二区免费在线观看| 老司机精品视频一区二区三区| 韩国三级hd中文字幕| 色天天综合色天天久久| 免费资源在线观看| 欧洲亚洲女同hd| 国产成人精品免费视| 国模吧无码一区二区三区| 91亚洲国产成人精品一区二三| 国产真实乱人偷精品视频| 精品国产在天天线2019| 久草在线视频福利| 91在线短视频| 欧美aⅴ99久久黑人专区| 99精品999| 亚洲另类在线视频| 日本中文字幕第一页| 亚洲精品成人久久电影| 五月天av在线| 欧美一级二级三级九九九| 在线国产一区二区| 国产香蕉精品视频| 亚洲电影一级黄| 国产一区二区三区三州| 中文一区二区视频| 欧美视频免费看| 亚洲国产精品女人| 精品系列免费在线观看| 久久精品第一页| 日韩av在线精品| 老色鬼在线视频| 色中色综合成人| 国产真实乱偷精品视频免| 欧洲美女女同性互添| 日韩精品一区二区三区视频在线观看 | 91丨九色porny丨蝌蚪| 五月天激情国产综合婷婷婷| 在线播放精品一区二区三区| 天堂中文av在线资源库| 清纯唯美一区二区三区| 黄色精品一二区| 97在线观看视频免费| 欧美成人精品3d动漫h| 成年美女黄网站色大片不卡| 亚洲永久一区二区三区在线| 精品中文字幕一区二区| 精品在线视频观看| 国产一区二区成人| 4438五月综合| 成人免费aaa| 国产精品久久久久三级| 伊人久久成人网| 久久久在线观看| 欧美精选视频在线观看| 国产精品中文久久久久久| 亚洲成人激情综合网| av大片在线看| 国产中文一区二区| 美女爽到呻吟久久久久| 色哟哟一一国产精品| 亚洲精品国产精品乱码不99按摩 | 小毛片在线观看| 在线一区二区三区做爰视频网站| h片在线免费观看| 蜜桃视频在线观看91| 久久99久久精品| 亚洲成人av影片| 欧美夫妻性视频| 欧美日韩在线播放视频| 中文在线字幕观看|