索引簽名是 TypeScript 中一個強大的特性,它允許我們在對象和類中使用動態的屬性名稱。通常情況下,我們會在對象或類中定義固定的屬性,但有時我們需要處理具有動態屬性名稱的情況。這時,索引簽名就派上了用場。 在這篇技術博文中,我們將介紹索引簽名的使用方法和用例,將展示如何定義帶有索引簽名的介面... ...
關於 Cloud Studio
Cloud Studio 是基於瀏覽器的集成式開發環境(IDE),為開發者提供了一個永不間斷的雲端工作站。用戶在使用Cloud Studio 時無需安裝,隨時隨地打開瀏覽器就能線上編程。
Cloud Studio 作為線上IDE,包含代碼高亮、自動補全、Git集成、終端等IDE 的基礎功能,同時支持實時調試、插件擴展等,可以幫助開發者快速完成各種應用的開發、編譯與部署工作。
IDE(Integrated Development Environment ) 作為碼農生產力的重要組成部分,相信很多伙伴都用過不少相關的產品。那麼不用下載和安裝的 IDE,你之前有體驗過嗎?
本篇博文將從作者參與 Cloud Studio 實戰訓練營的親身體會出發,帶領你一步步揭開Cloud Studio 的神秘面紗。
第一步:註冊
點開這裡,先去右上角註冊。
如果大家有 github 的賬號,那麼我推薦你使用 github 來註冊,這樣你編寫好的代碼可以一鍵保存到 github 上。
如果沒有 github 賬號,可以先去註冊“CODING DevOps”,然後使用“CODING DevOps”賬號登錄。
第二步:創建自己的工作空間
登錄好以後,先點擊左下角新建工作空間。
在跳轉的頁面中,可以配置你的項目將要托管到哪個服務商,這裡支持 coding 和 github
因為最開始推薦大家使用 github 登錄,所以這裡選擇 github,就會自動同步github 中的團隊和項目
是不是很方便。
當然, Cloud Studio 提供了茫茫多的模板,我們可以不創建工作空間,而是從中選擇自己熟練的技術棧打開也可以的。
這裡需要註意一點,通過空間模版創建的項目,預設沒有連接 git 倉庫。
所以,你要自己手動執行git init
、git remote add origin <address>
、git add .
、git commit
以及git push
等操作。
選擇模板以後,項目會自動運行起來,第一步是配置運行環境,這一點和本地的 IDE 有明顯的區別。
等環境跑完了,你就能得到一個在瀏覽器中運行的 vscode (ps: 笑臉)
當然這也可以理解,畢竟 cloud studio 主打一個線上編輯,所以採用什麼外觀無非套殼子,沒必要重覆造車輪對吧。
第三步:編寫實戰訓練代碼
老規矩哈,先體驗一把:搗蛋鬼向你推送了體驗地址
這個小 demo 主要實現了兩個功能:
- 上傳頭像
- 將上傳的頭像通過 canvas 重繪為黑白風格並付給 a 鏈接,這樣用戶就可以點擊下載
整體實現的邏輯並不複雜,核心的邏輯大概是這樣:
- 通過設置 input 的屬性 type 為 file,來獲取上傳的頭像
- 繪製一個靜態的 canvas 到頁面上,用來當作畫布
- 使用 canvas 的 drawImage 方法將獲取的頭像繪製到畫布上
- 使用 canvas 的 getImageData 方法獲取畫布中頭像圖片的像素
- 遍歷得到的所有的像素,計算每個像素的灰度值
- 根據得到的灰度值大小,將每個像素點的 rgb 設置為 0 或者 255
- 將轉換後的像素點通過 putImageData 方法重新繪製到畫布上
- 通過 canavs 的 toDataURL 方法將圖片轉換為 base64 的字元串
- 將 base64 字元串賦值給攜帶 download 屬性的 a 標簽,從而實現點擊下載
現在我們已經初步知道了實現的邏輯,那就開始編寫代碼吧。
配置 App.vue
<script setup>
import { onMounted } from 'vue';
onMounted(()=>{
// 獲取元素
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var uploadBtn = document.getElementById('uploadBtn');
// 監聽文件上傳事件
uploadBtn.addEventListener('change', function(e) {
var file = e.target.files[0];
// 創建圖像對象
var img = new Image();
img.onload = function() {
// 將圖像繪製到畫布上
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
// 應用卡通效果
applyCartoonEffect();
};
img.src = URL.createObjectURL(file);
});
// 應用卡通效果
function applyCartoonEffect() {
// 獲取畫布的像素數據
var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
var data = imageData.data;
// 遍歷每個像素點
for (var i = 0; i < data.length; i += 4) {
// 獲取像素點的RGB值
var r = data[i];
var g = data[i + 1];
var b = data[i + 2];
// 計算灰度值
var gray = (r + g + b) / 3;
// 將像素點轉換為卡通效果,即將灰度值處理為0或255
if (gray < 128) {
data[i] = data[i + 1] = data[i + 2] = 0; // 設置為黑色
} else {
data[i] = data[i + 1] = data[i + 2] = 255; // 設置為白色
}
}
// 將處理後的像素數據重新繪製到畫布上
ctx.putImageData(imageData, 0, 0);
var downloadLink = document.getElementById('downloadLink');
downloadLink.href = canvas.toDataURL(); // 預設為PNG格式
}
})
</script>
<template>
<main>
<div class="wrapper">
<input type="file" id="uploadBtn" accept="image/\*">
<a id="downloadLink" href="#" download="cartoon\_avatar.png">下載</a>
</div>
<canvas id="canvas" width="300" height="300"></canvas>
</main>
</template>
<style scoped>
canvas {
border: 1px solid #000;
}
.wrapper{
width: 300px;
}
</style>
寫完後就可以在右邊的預覽中實驗效果,這樣一個有趣的小 demo 就實現了。
最後,點擊右側的源代碼管理,就可以提交代碼,然後把代碼上傳到 github ,大功告成 。
項目地址