小程序—九宮格心形拼圖

說明

前幾天在朋友圈看到好幾次這種圖片。

這種圖片,是用九張圖片拼成的一個心形。

感覺很有趣,就上網查了查怎么做,大部分的說法就是用美圖秀秀的拼圖功能來做, 在微信小程序中也有專門做心形拼圖的小程序,我都試了試之后,感覺還可以更加簡單一些,于是我就自己做了個小程序。

實現小程序的思路

1、有兩個 canvas,一個小的 canvas 顯示最后會是什么樣子,一個大的 canvas 用來最后進行截圖,生成圖片,保存到相冊。
通過CSS的定位,把大的 canvas 移到屏幕外面不讓用戶看到就可以了。
而如果用小的canvas 保存圖片的話,最后的圖片有些模糊。

2、canvas 可以看成一個 9 * 9 的網格,

用一個叫 heart 的數組來表示就是這樣的。

用其中的小格子,來拼出心形,根據數組的內容在 canvas 上進行渲染。

小程序的功能

這個小程序有 選擇單張圖片,選擇多張圖片,補充圖片,保存圖片,重置,推薦,意見反饋,這幾個功能。

選擇單張圖片

當用戶點擊心形區域的時候,就可以選擇單張圖片,調用 wx.chooseImage 就可以從本地相冊選擇圖片,然后就把這張圖,畫在 canvas上,具體畫的位置就是用戶點擊的位置。

在小的 canvas上綁定 touchend 事件,觸發事件后,事件中有一個 changedTouches 屬性,這是一個保存了,當前變化的觸摸點信息的數組,這個數組中的元素有 x 和 y 屬性,也就是觸摸點距離 canvas 左上角的距離。

// 觸摸點在 x 軸的值
var x = e.changedTouches[0].x;
// 觸摸點在 y 軸的值
var y = e.changedTouches[0].y;
復制代碼

有 x 軸 和 y 軸的距離后,算出具體應該畫在哪個格子上。

//grid 表示一個格子的寬度// 確定 x 軸是在第幾個格子
x = Math.floor(x / grid);// 確定 y 軸是在第幾個格子
y = Math.floor(y / grid);
復制代碼

知道在哪個格子畫之后,就要確定畫圖片的哪部分了,因為所有的格子都是正方形的,但是用戶選擇的圖片不一定是正方形,如果壓縮成正方形會很難看,所以我畫的時候,選擇了正中間的部分來畫,

通過 wx.getImageInfo 來獲取圖片信息,以短邊為正方形的寬,然后從(長邊 - 短邊)/2 的地方來畫。

// 獲取圖片的寬和高
var width = res.width;
var height = res.height;//  如果圖片不是正方形,只畫中間的部分
// sWidth 表示正方形的寬
var sWidth = width > height ? height : width;
// sx 是源圖像的矩形選擇框的左上角 X 坐標
var sx = 0;
// sy 是源圖像的矩形選擇框的左上角 y 坐標
var sy = 0;
if (width > height) {sx = (width - height) / 2;
}
if (width < height) {sy = (height - width) / 2;
}
復制代碼

知道畫什么,在哪里畫之后,調用 canvasContext.drawImage 來畫就可以了。

選擇多張圖片

選擇多張圖片,同樣是調用 wx.chooseImage 方法,成功選擇多張圖片后,返回的對象中有一個 tempFilePaths 屬性,這個屬性保存了,圖片的本地文件路徑列表。

然后遍歷 heart 數組,也就是保存心形數據的數組,如果數組中某個元素的值是1,也就是說在心形范圍內,就按順序從 tempFilePaths 中取一張圖片畫上去,畫的時候同樣的,如果不是正方形就只畫中間的部分。

補充圖片

在 image 的文件中,有保存幾張圖片,用來補充心形,他們的路徑保存在一個數組中。

 // 用來補充心形的圖片images: ['../../images/1.jpg','../../images/2.jpg','../../images/3.jpg','../../images/4.jpg','../../images/5.jpg','../../images/6.jpg','../../images/7.jpg','../../images/8.jpg','../../images/9.jpg','../../images/10.jpg',]
復制代碼

然后就是遍歷 heart 數組,如果數組的某個元素的值是1,就隨機從這組圖片中選擇一張畫上去。

畫一張圖片,畫多張圖片,補充圖片,他們都是在 canvas 上畫圖片,為了避免已經畫了圖片的位置被覆蓋,他們所畫的圖片的等級是不同的。

補充圖片:1
畫多張圖片:2
畫一張圖片:3
復制代碼

等級高的可以覆蓋等級低的,等級低的不能覆蓋等級高的,同等級的,除了畫多張圖片的不能覆蓋,其余的兩種情況,都可以覆蓋。

簡單意思就是: 補充圖片,補充完了之后,再補充會把原來補充的覆蓋掉,但是用戶選擇的圖片不會被覆蓋掉。
畫多張圖片,可以覆蓋掉補充的圖片,但用戶選擇的圖片也不會覆蓋掉。
畫一張圖片,不管這個位置有沒有圖片,都會再畫一張。

保存圖片

保存圖片的時候,就是按順序對大的 canvas 進行截取,然后保存成圖片,主要靠 wx.canvasToTempFilePath 這個API來實現,這個 API ,可以把當前畫布指定區域的內容導出生成指定大小的圖片,并返回文件路徑。

這里要注意幾個細節

1、為了避免最后保存的圖片有黑色背景,最好開始的時候就在 canvas 上畫一個 和 canvas 大小一樣的矩形,矩形填充上顏色。

2、為了保存的圖片,在用戶的相冊中也能保持心形。需要按下面這個順序來保存圖片

3、wx.canvasToTempFilePath 中有兩個選填的參數 destWidth 和 destHeight,這個兩個參數決定 輸出圖片寬度和高度,如果不是準確的知道是多少,用默認值就可以。

destWidthdestHeight 單位是物理像素(pixel),canvas 繪制的時候用的是邏輯像素(物理像素=邏輯像素 * density),所以這里如果只是使用 canvas 中的 width 和 height(邏輯像素)作為輸出圖片的長寬的話,生成的圖片 width 和 height 實際上是縮放了到 canvas 的 1 / density 大小了,所以就顯得比較模糊了。

而默認值是 width * 屏幕像素密度

文檔中提到的屏幕像素密度,應該不是指每英寸屏幕所擁有的像素數,而是指設備像素比(pixelRatio),也就是用多少個物理像素去顯示 1px 的 CSS 像素。 用API wx.getSystemInfo 可以查看設備像素比

wx.getSystemInfo({success: function(res) {console.log(res.pixelRatio)}
})
復制代碼

這里如果我的理解有誤,還請知道的小伙伴指出。

說了這么多,主要就是想說用默認的值其實就已經很清晰了。

4、因為要保存9張圖片,所以需要一些時間,這個時候就需要一個進度條了,保存圖片的時候,顯示進度條,禁用保存按鈕,畢竟點擊一下按鈕就是9張圖片,所以這個時候還是禁用了好,每保存一張圖片進度條的值就 +12 ,超過100的時候,就表示 9張圖片都保存好了。

而微信小程序中也剛好有進度條(progress)這個組件。

重置

這個功能就是遍歷 heart 數組,用一種顏色,根據數組內容,把心形畫出來。然后再在 x 軸 和 y 軸上畫兩條線,行成九宮格的樣子。

推薦 和 意見反饋

 <button open-type='share'>推薦給朋友</button><button open-type='feedback'>意見反饋
復制代碼

這個兩個功能就是用了,微信小程序的 button 組件,這里需要注意的就是,在清除 button 的默認樣式時,需要把 button 的 after 偽元素的邊框也去掉。

button::after{border: 0; 
}
復制代碼

可以優化的地方

有一些地方是小程序在替用戶做選擇,比如,如果所選擇的圖片不是正方形,就畫中間的部分,但是中間的部分不一定是用戶想要的,而如果每張圖片都要用戶自己來選擇畫哪部分,顯然是有些麻煩了,這里還可以繼續優化下。

還有在補充圖片的時候,補充的圖片也不一定是用戶喜歡的,所以這部分再考慮是不是可以加一些標簽,用戶選擇不同的標簽,來補充符合標簽的圖片,類似 QQ音樂的歌詞海報這樣。

總結

這次做的這個九宮格心形拼圖的小程序,第一版已經上線了。

開源地址:github.com/FEWY/jigsaw
如果你喜歡這個小程序的話,可以 star 支持一下。

這個小程序不管在代碼,還是功能上都還有許多地方可以繼續優化,如果有需要的朋友可以直接拿去改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253965.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第二部分:志愿錄取標準

第二部分&#xff1a;志愿錄取標準 零、概況一、傳統志愿錄取過程二、平行志愿錄取過程三、17年志愿錄取過程 零、概況自1977年&#xff0c;恢復高考以來&#xff0c;高考錄取標準&#xff0c;作為公平線&#xff0c;都是相當透明的。這部分分享&#xff0c;以錄取標準&#xf…

100. Same Tree

Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nodes have the same value. 遞歸遍歷左子樹和右子樹 /*** Definition for a binary tree node.* struct T…

關于RTP時間戳及多媒體通信同步的問題/H264關于RTP協議的實現

http://www.rosoo.net/a/201101/10776.html http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829e37b600c88e.html H264關于RTP協議的實現:http://www.rosoo.net/a/201108/14896.html RTP協議包頭的格式&#xff1a; 10~16 Bit為PT域&#xff0c;指的就是負載類型…

程序員懂點經濟學-股票投資

2019獨角獸企業重金招聘Python工程師標準>>> ▍寫在前面 前面有文章 關于程序員如何賺點小錢 講過 合理的投資理財&#xff0c;可以了解一下. 再次建議&#xff0c;不要將全身家當投入股市&#xff0c;建議投入10~30%就好了. (不要拿輸不起的錢來炒股&#xff0c;比…

徹底弄懂響應式設計中的em和rem

前一陣子在響應式開發中遇到了em和rem的問題&#xff0c;也上網搜過一些文章&#xff0c;篇幅很長&#xff0c;也沒有仔細看&#xff0c;今天來總結一下。 rem是指&#xff1a;根元素&#xff08;root element&#xff0c;html&#xff09;的字體大小&#xff0c; em是指&#…

JAVA字符串

字符串 1. 字符串 1.1 字符串概述和特點 java.lang.String類代表字符串。 API當中說&#xff1a;Java 程序中的所有字符串字面值&#xff08;如 "abc" &#xff09;都作為此類的實例實現。 其實就是說&#xff1a;程序當中所有的雙引號字符串&#xff0c;都是String類…

21分鐘 MySQL 入門教程

轉自 21分鐘 MySQL 入門教程 一、MySQL的相關概念介紹二、Windows下MySQL的配置配置步驟MySQL服務的啟動、停止與卸載三、MySQL腳本的基本組成四、MySQL中的數據類型五、使用MySQL數據庫登錄到MySQL創建一個數據庫選擇所要操作的數據庫創建數據庫表六、操作MySQL數據庫向表中插…

node-sass報錯解決方法

node-sass報錯解決方法 node-sass報錯解決方法 在Vue.js中&#xff0c;每一個vue文件都是一個組件&#xff0c;在.vue文件中可以將模板&#xff0c;腳本&#xff0c;樣式寫在一起&#xff0c;便于組織整個組件。在使用template&#xff0c;script時&#xff0c;編寫css樣式時&a…

微軟人工智能愿景:根植于研發 寄望于“對話”

過去25年來&#xff0c;微軟公司持續投入人工智能的發展愿景。現在&#xff0c;借助全新發布的聊天機器人Zo、Cortana Decices SDK和智能套件、以及擴展智能工具&#xff0c;這一愿景即將成為現實。12月13日&#xff0c;在舊金山的一次小聚會上&#xff0c;微軟全球執行副總裁、…

H264 TS/ES

http://blog.csdn.net/heanyu/article/details/6229724

Java中Semaphore(信號量) 數據庫連接池

計數信號量用來控制同時訪問某個特定資源的操作數或同時執行某個指定操作的數量 A counting semaphore.Conceptually, a semaphore maintains a set of permits. Each acquire blocks if necessary until a permit is available, and then takes it. Each release adds a permi…

Visual Studio for Mac Preview離線下載安裝

Visual Studio for Mac離線下載安裝。 環境&#xff1a;OS X EI Caption 10.11.2 .NET Core SDK 1.1 需預先安裝 .NET Core 1.1 SDK macOS版下載地址:https://go.microsoft.com/fwlink/?LinkID835011 安裝SDK需先安裝openssl。 brew update brew install openssl mkdir -p /us…

LOAM_velodyne學習(一)

在研讀了論文及開源代碼后&#xff0c;對LOAM的一些理解做一個整理。 文章&#xff1a;Low-drift and real-time lidar odometry and mapping 開源代碼&#xff1a;https://github.com/daobilige-su/loam_velodyne 系統概述 LOAM的整體思想就是將復雜的SLAM問題分為&#x…

實戰Vue簡易項目(2)定制開發環境

本章內容包含上一章思考的解決&#xff0c;還有一些其它的定制... CSS預處理 關于對.vue文件模塊處理規則的配置依次可在build/webpack.base.conf.js->build/vue-loader.conf.js->build/utils.js文件中跟蹤&#xff1b; 而loaders的關鍵在于build/vue-loader.conf.js文件…

LINUX framebuffer

http://wangshh03.blog.163.com/blog/static/49103415201001231317484/ 一、FrameBuffer的原理 FrameBuffer 是出現在 2.2.xx 內核當中的一種驅動程序接口。 Linux是工作在保護模式下&#xff0c;所以用戶態進程是無法象DOS那樣使用顯卡BIOS里提供的中斷調用來實現直接寫屏&…

[POI2007]POW-The Flood

題目描述 給定一張地勢圖&#xff0c;所有的點都被水淹沒&#xff0c;現在有一些關鍵點&#xff0c;要求放最少的水泵使所有關鍵點的水都被抽干 輸入輸出格式 輸入格式&#xff1a; In the first line of the standard input there are two integers and , separated by a sin…

LOAM_velodyne學習(二)

LaserOdometry 這一模塊&#xff08;節點&#xff09;主要功能是&#xff1a;進行點云數據配準&#xff0c;完成運動估計 利用ScanRegistration中提取到的特征點&#xff0c;建立相鄰時間點云數據之間的關聯&#xff0c;由此推斷lidar的運動。我們依舊從主函數開始&#xff1…

戶外穿越

晚上很早就睡了&#xff0c;并且&#xff0c;太過激動&#xff0c;所以早上四點五十分就被驚醒&#xff0c;然后到早上鬧鐘響。 早上匆匆忙吃過早餐&#xff0c;就趕去坐車&#xff0c;到登山之前&#xff0c;坐了大巴車&#xff0c;又坐了景區的車&#xff0c;景區的路是山路十…

【oracle】關于創建表時用default指定默認值的坑

剛開始學create table的時候沒注意&#xff0c;學到后面發現可以指定默認值。于是寫了如下語句&#xff1a; 當我查詢的時候發現&#xff0c;查出來的結果是這樣的。。 很納悶有沒有&#xff0c;我明明指定默認值了呀&#xff0c;為什么創建出來的表還是空的呢&#xff1f;又跑…

Makefile中用宏定義進行條件編譯(gcc -D)/在Makefile中進行宏定義-D

在源代碼里面如果這樣是定義的&#xff1a; #ifdef MACRONAME //可選代碼 #endif 那在makefile里面 gcc -D MACRONAMEMACRODEF 或者 gcc -D MACRONAME 這樣就定義了預處理宏&#xff0c;編譯的時候可選代碼就會被編譯進去了。 對于GCC編譯器&#xff0c;有如下選項&…