精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩精品电影| 成人性生交大片免费看在线播放| 久久综合中文| 亚洲欧洲xxxx| 亚洲一区二区三区观看| 亚洲91av| 国产女主播视频一区二区| 亚洲aaaaaa| 成人午夜视频精品一区| 欧美亚洲国产激情| 精品国产免费久久| 亚洲欧美视频二区| 亚洲色图官网| 亚洲视频一二三区| 久久久久久久久久久一区| 国产口爆吞精一区二区| 亚洲在线电影| 欧美激情videoshd| 日韩欧美黄色网址| 牛牛影视久久网| 91麻豆精品91久久久久同性| 日韩中文字幕在线视频观看| 国产秀色在线www免费观看| 久久九九影视网| 国产精品久久久久久久免费大片| 亚洲图片小说视频| 久久一日本道色综合久久| 精品欧美一区二区三区| 欧美韩国日本在线观看| 免费网站在线高清观看| 五月婷婷激情久久| 九一在线视频| 成人av资源在线观看| 91久久国产婷婷一区二区| 国产精品第5页| 亚洲黄色大片| 9色在线视频| 9999精品成人免费毛片在线看| 久久久777精品电影网影网 | 五月激情久久| 精品人伦一区二区三区蜜桃网站 | 无人在线观看的免费高清视频| 精品国产乱码一区二区三 | www亚洲成人| 吉吉日韩欧美| 黑人欧美xxxx| 欧美精品第1页| 亚洲成人午夜电影| 成人h在线播放| ,一级淫片a看免费| 精品中文视频| 国产乱淫av一区二区三区 | 国产自产自拍视频在线观看| 亚洲视频小说图片| 自拍另类欧美| 黄色免费在线网站| 日韩一区有码在线| 日韩中文字幕亚洲精品欧美| 免费大片黄在线| 三级电影在线看| 国产在线网站| 久久久久久毛片| 久久久99国产精品免费| 在线观看亚洲色图| 欧美性videos| 成人免费在线观看入口| 欧美日韩一区二区三区电影| 成人在线网址| 一区二区日韩av| 日韩视频免费播放| 在线观看福利电影| 在线亚洲一区二区| 777一区二区| 日韩一二三区在线观看| 亚洲成人av中文字幕| 日韩aaaaa| 狠狠做六月爱婷婷综合aⅴ| 中文日韩电影网站| 日本黄色片免费观看| 日本xxxxwww| 丝袜视频国产在线播放| 日韩视频免费| 国产精品黄色av| 91麻豆成人精品国产免费网站| 国产在线精品不卡| 久久久久无码国产精品一区| www亚洲人| 亚洲色图在线视频| 欧美色一级片| 欧美一区二区成人| 黑丝av在线播放| 红桃视频在线观看一区二区| 久久伊人色综合| 日韩精品无码一区二区| 日本午夜精品一区二区三区电影| 91性高湖久久久久久久久_久久99| 成人一区二区三| 一区二区三区视频在线观看视频| 亚洲欧美一区二区久久| 大陆极品少妇内射aaaaa| 成人看片毛片免费播放器| 日韩美女一区二区三区四区| 亚洲第一香蕉网| 亚洲精品a级片| 日本精品久久久| 99视频免费看| 亚洲国产精品二十页| 777av视频| 婷婷久久综合九色综合99蜜桃| 亚洲激情中文字幕| 性欧美疯狂猛交69hd| 久久精品男女| 国产精品一区二区三区不卡 | 成人一区在线观看| 杨幂一区欧美专区| 肉色欧美久久久久久久免费看| 日韩欧美中文字幕一区| 久久久久久成人网| 一道本一区二区| 亚洲一区二区三区久久| 亚洲精品传媒| 91黄视频在线观看| 三级视频网站在线观看| 欧美在线日韩| 国产专区欧美专区| 成人高清免费在线播放| 欧美性猛交xxxx乱大交| 成人免费看片载| 亚洲国产一成人久久精品| 国产精品久久久久久久av电影| 水中色av综合| 一区二区三区高清| 91蝌蚪国产九色| 欧美另类69精品久久久久9999| 一级黄色在线视频| 99热精品一区二区| 国产91沈先生在线播放| 国产精品一区二区美女视频免费看 | 中文字幕日韩av| 精品成在人线av无码免费看| 日本在线视频中文有码| 91精品视频网| 中文字幕美女视频| 美女网站色91| 亚洲在线色站| www.久久热| 日韩中文字幕不卡视频| 国产精品xxxxxx| 国产欧美日本一区二区三区| 少妇高清精品毛片在线视频| 亚洲最好看的视频| 日本伊人精品一区二区三区介绍| 亚洲av成人无码网天堂| 欧美天堂在线观看| 自拍偷拍亚洲天堂| 日韩二区三区四区| 一区二区三区四区五区视频| 日本免费一区二区三区等视频| 视频在线一区二区| 999av视频| 一区二区免费在线| a天堂视频在线观看| 米奇777在线欧美播放| 日韩片电影在线免费观看| 国产91精品在线| 久久久91精品国产| 亚洲国产精品成人久久蜜臀| 亚洲福利一区二区| 免费观看一级一片| 奇米精品一区二区三区四区| 中文字幕久久一区| 欧美日本三级| 91av福利视频| 999国产在线视频| 欧美精品一二三四| 国产亚洲精品av| 91视频一区二区三区| 亚洲最大综合网| 女同性一区二区三区人了人一| 国产成人精品一区二区三区福利| 欧美久久天堂| 久久精品视频va| 欧美一区二区三区激情| 91国模大尺度私拍在线视频| www.av视频| 久久久久久久久蜜桃| 超碰超碰在线观看| 亚洲日本成人| 亚洲欧洲精品在线| 白浆视频在线观看| h片在线播放| 亚洲色图另类专区| 性高潮免费视频| 久久久久久婷| 亚洲天堂第一区| 久久93精品国产91久久综合| 成人精品视频99在线观看免费| 2019中文字幕在线电影免费| 在线视频欧美日韩| 久久综合伊人77777麻豆最新章节| 超碰在线97观看| 国产精品视频麻豆| 国产性生活毛片| 精品综合久久久久久8888| 欧美亚洲日本一区二区三区| 久久中文字幕av一区二区不卡| 国产精品久久精品国产 | 亚洲精品91| 日本一区免费观看| 国产三级精品三级在线观看国产| 国产日韩精品综合网站| 中文字幕资源网在线观看免费| 欧美成人性色生活仑片| 成人一区二区不卡免费| 亚洲精品国产综合久久| xxxwww在线观看| 欧美挠脚心视频网站| 成人毛片一区二区三区| 亚洲v日本v欧美v久久精品| www深夜成人a√在线| 欧美激情自拍偷拍| 青青草视频播放| 成人激情免费电影网址| 成年人网站av| 麻豆精品一二三| 免费观看成人在线视频| 久久不射网站| 无罩大乳的熟妇正在播放| 欧美日韩亚洲一区在线观看| 久久久一二三四| 色综合五月天| 色姑娘综合网| 国产欧美高清视频在线| 裸模一区二区三区免费| 欧美精品国产白浆久久久久| 国产精品theporn88| 麻豆精品一区| 91传媒在线免费观看| 精品午夜av| 亚洲一区二区三区乱码aⅴ蜜桃女| 国内自拍亚洲| 国产精品丝袜视频| 中文字幕日本一区二区| 国产精品大陆在线观看| 日韩一区精品| 国产精品丝袜久久久久久高清| 精品国产欧美日韩一区二区三区| 国产精品福利在线| 福利一区和二区| 成人羞羞国产免费| crdy在线观看欧美| 成人在线免费观看一区| 激情亚洲另类图片区小说区| 狠狠色伊人亚洲综合网站色 | 亚洲免费久久| 四虎成人av| 激情五月五月婷婷| 国内久久视频| 国产最新免费视频| 日本欧美一区二区三区乱码| 国模私拍视频在线观看| 国产伦精品一区二区三区视频青涩 | 免费成人在线观看av| 精品国产不卡| 国产精品12p| 影音先锋久久| 欧美亚洲日本在线观看| 蜜臀久久99精品久久久久宅男| 九九热精品在线播放| 国产精品99久久久久| 欧亚乱熟女一区二区在线| 久久综合九色综合97婷婷| 免费看黄色三级| 亚洲精品国产第一综合99久久 | 欧美专区在线观看一区| 国产精品视频久久久久久| 日韩美女一区二区三区四区| 嫩草研究院在线观看| 日韩亚洲欧美成人| 高清电影在线免费观看| 国产suv精品一区二区三区88区| 精品国产黄a∨片高清在线| 97碰碰视频| 精品一区毛片| 大荫蒂性生交片| 噜噜噜91成人网| 91网址在线观看精品| 不卡电影一区二区三区| 欧美一区二区三区粗大| 亚洲一区视频在线观看视频| 9i精品福利一区二区三区| 欧美一区二区福利视频| 欧美高清成人| 欧美丰满少妇xxxxx做受| 天天免费亚洲黑人免费| 99久久无色码| 日本不卡高清| 鲁一鲁一鲁一鲁一澡| 国产在线看一区| a毛片毛片av永久免费| 一区二区三区中文字幕在线观看| 久久久黄色大片| 精品久久久久久久久久久久久久久久久 | 91在线国内视频| 成人免费精品动漫网站| 日韩欧美国产中文字幕| 精品久久人妻av中文字幕| 伊人男人综合视频网| av资源中文在线| 欧洲成人在线视频| 欧美日韩精品综合| 天天操天天爱天天干| 中文字幕日韩欧美在线| aa国产成人| 亚洲一区二区中文| 精品国产99| 日日橹狠狠爱欧美超碰| 国产精品18久久久久久久久| 国产精品久久久视频| 日韩欧美国产成人| 国产91视频在线| 国产又黄又大久久| 五月天六月丁香| 中文字幕av一区 二区| 日韩美女视频网站| 欧美成人精品福利| 高清全集视频免费在线| 国产精品久久久久久久久久99| 丝袜美腿综合| 国产3p露脸普通话对白| 国产成人欧美日韩在线电影| 亚洲综合图片一区| 欧美色视频在线观看| 黄色国产在线| 日本一区二区在线播放| 妖精视频一区二区三区免费观看| 婷婷无套内射影院| 国产成人av网站| 欧美精品入口蜜桃| 日韩欧美在线不卡| 91精品久久| 成人欧美一区二区三区黑人免费| 91精品一区二区三区综合在线爱 | 国产在线精品一区二区三区| 午夜影院欧美| 91视频福利网| 亚洲一二三级电影| 高h震动喷水双性1v1| 久久久久久久一| 秋霞影视一区二区三区| 成年网站在线免费观看| 国产亚洲一二三区| 国产精品乱码一区二区视频| 在线成人免费网站| 四虎永久精品在线| 欧美黄网在线观看| 成人app下载| 亚洲另类在线观看| 尤物九九久久国产精品的分类| 成人性片免费| 中文字幕一区二区三区精彩视频| 国产一区二区三区香蕉| www.超碰在线观看| 亚洲电影天堂av| 在线人成日本视频| 一区二区三区四区免费视频| 国产在线精品不卡| 在线观看免费国产视频| 亚洲香蕉在线观看| 欧美视频三区| 尤物av无码色av无码| 国产精品无遮挡| 国产福利小视频| 2020国产精品视频| 99久久国产综合精品成人影院| 一级黄色高清视频| 欧美性猛交xxxx乱大交蜜桃| 全黄一级裸体片| 97视频精品| 不要播放器的av网站| 中文字幕欧美日韩一区| av中文字幕观看| 欧美在线视频一区| 天天影视综合| 最近中文字幕无免费| 欧美在线三级电影| 日本在线视频www鲁啊鲁| 欧美国产二区| 韩国女主播成人在线观看| 国产福利拍拍拍| xxx成人少妇69| 香蕉久久精品| 99九九精品视频| 亚欧色一区w666天堂| 999国产在线视频| 精品日本一区二区| 国产在线不卡一区| 一级一片免费看| 欧美精品电影在线| 日韩成人a**站|