![創(chuàng)建馬賽克效果_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/9/832a65e9-0f18-4e3b-8cdc-e0c5963f127c/832a65e9-0f18-4e3b-8cdc-e0c5963f127c1.gif)
![創(chuàng)建馬賽克效果_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/9/832a65e9-0f18-4e3b-8cdc-e0c5963f127c/832a65e9-0f18-4e3b-8cdc-e0c5963f127c2.gif)
![創(chuàng)建馬賽克效果_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/9/832a65e9-0f18-4e3b-8cdc-e0c5963f127c/832a65e9-0f18-4e3b-8cdc-e0c5963f127c3.gif)
![創(chuàng)建馬賽克效果_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/9/832a65e9-0f18-4e3b-8cdc-e0c5963f127c/832a65e9-0f18-4e3b-8cdc-e0c5963f127c4.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、18從零繪制圖像這一節(jié)我們可以開始制作一些真正漂亮的圖像了,例如從創(chuàng)建像素開始制作自己的圖 像。要創(chuàng)建一些像素, 需要調(diào)用 2D 渲染上下文的 createImageData 方法。 通過傳入寬度和高 度,它會返回一個包含所有常規(guī)屬性的ImageData 對象: width 、height 和(最重要的) data。data 屬性所包含的 CanvasPixelArray 將保存新的像素,此時它們是不可見的,因為它們都被 設(shè)置為透明黑色。在下一個例子中,我們將創(chuàng)建一個包含200 200 透明像素區(qū)域的 ImageData 對象,然后將它們?nèi)啃薷某杉t色。var imageData = cont
2、ext.createImageData(200, 200);var pixels = imageData.data;變量 pixels 僅用作訪問 CanvasPixelArray 中的像素的快捷方式。修改顏色值與查詢顏色值一樣簡單:都是讀寫CanvasPixelArray 中的顏色值。如果想將所有像素修改為紅色,那么需要使用 for 循環(huán)語句遍歷每一個像素。var numPixels = imageData.width*imageData.height;for (var i = 0; i numPixels; i+) pixelsi*4 = 255; / Redpixelsi*4+1 = 0
3、; / Greenpixelsi*4+2 = 0; / Bluepixelsi*4+3 = 255; / Alpha;變量 numPixels 保存了 ImageData 對象中的像素個數(shù),它就是 for 循環(huán)的執(zhí)行次數(shù)。在 每一次循環(huán)過程中, 我們都使用一個簡單算法給每個像素賦予顏色值。 每個像素都有 4 個顏 色值,所以將像素個數(shù)乘以 4 就能夠得到該像素的紅色顏色值在 CanvasPixelArray 中的索引 位置。然后,就可以將紅色顏色值設(shè)置為255(全色),綠色和藍色設(shè)置為 0,而阿爾法值設(shè)置為 255,這樣它就變成不透明的 r。非常簡單!按照目前情況,我們所做的就是創(chuàng)建一個Ima
4、geData ,然后將像素修改為紅色?,F(xiàn)在畫布上還看不見任何效果,因為我們還沒有將新像素畫到上面。為此,我們需要調(diào)用2D 渲染上下文的 putImageData 方法。 這個方法可以接受 3 個或 7 個參數(shù): ImageData 對象、繪制像 素數(shù)據(jù)的原點坐標( x, y)、所謂臟矩形 (dirty rectangle) 的原點坐標( x, y),臟矩形的寬度 和高度。在這個例子中,你暫時可以不考慮臟矩形的用途,它的作用只是定義 ImageData 對 象中需要繪制的像素。context.putImageData(imageData, 0, 0);這樣會在畫布原點繪制新的紅色像素(參見圖1)
5、。1 / 5圖 1 從零開始創(chuàng)建和繪制像素隨機繪制像素只有紅色像素似乎太單調(diào),讓我們更進一步,繪制一些完全隨機的顏色。這也很簡單。for (var i = 0; i numPixels; i+) pixelsi*4 = Math.floor(Math.random()*255); / Redpixelsi*4+1 = Math.floor(Math.random()*255); / Greenpixelsi*4+2 = Math.floor(Math.random()*255); / Bluepixelsi*4+3 = 255; / Alpha;通過修改前一個例子中設(shè)置顏色值的代碼, 我們可以
6、插入 0 至 255 之間的隨機數(shù)。 我們 仍然保持阿爾法值為 255,否則有一些像素會變成透明的。注意,我們使用了Math.floor 來向下舍入產(chǎn)生的隨機數(shù)(例如, 150.456 會變成 150)。結(jié)果,我們得到一些雜亂的像素點(參見圖 2)。注意 :Math.random 可以產(chǎn)生 0 到 1 之間的隨機小數(shù)將它與另一個數(shù)字相乘,就可以 得到 0 與該數(shù)字(乘數(shù))之間的隨機數(shù)。例如, Math.random()*2 55 將得到 0 與 255 之間的 一個隨機數(shù)。圖2 隨機設(shè)置在畫布上繪制的像素的顏色創(chuàng)建馬賽克效果但是, 雜亂的像素并不是畫布的最佳用途。 那么創(chuàng)建一個馬賽克效果呢?肯
7、定更有意思 一些。 它的實現(xiàn)方法是, 創(chuàng)建一個新像素區(qū)域,然后將它分割到一個柵格中,并為柵格每個 片段設(shè)置隨機顏色。 最復(fù)雜的部分是計算出每個像素應(yīng)該落到哪個片段, 這樣相同的片段就 可以設(shè)置相同的顏色。在圖 3 中,我們會看到每個片段實際上是由許多像素構(gòu)成的。圖 3 將畫布分割到像素片段柵格中 稍后,我會介紹如何計算出每個片段的像素。現(xiàn)在,先來做一些基礎(chǔ)性工作。var imageData = context.createImageData(500, 500);var pixels = imageData.data;/ Number of mosaic tilesvar numTileRows
8、 = 4;var numTileCols = 4;/ Dimensions of each tilevar tileWidth = imageData.width/numTileCols;var tileHeight = imageData.height/numTileRows;前兩行代碼現(xiàn)在你應(yīng)該很熟悉了,它們創(chuàng)建了一個500 500 像素的 ImageData 對象,然后將 CanvasPixelArray 保存在一個變量中。后面的代碼是定義兩個變量,用于聲明像素區(qū) 域劃分的片段數(shù),其中包括每行每列的馬賽克數(shù)。從現(xiàn)在起,我們將片段稱為塊 (tile) ,因為 這個詞更能說明它們的實際作用。
9、 最后兩行代碼是根據(jù) ImageData 對象的尺寸和各行各列的 塊數(shù)計算出每個塊的寬度和高度(以像素為單位) 。現(xiàn)在,我們有了足夠信息,可以開始遍歷這些塊和修改像素的顏色值。for (var r = 0; r numTileRows; r+) for (var c = 0; c numTileCols; c+) / Set the pixel values for each tilevar red = Math.floor(Math.random()*255);var green = Math.floor(Math.random()*255);var blue = Math.floor(Ma
10、th.random()*255);這是一個嵌套循環(huán), 第一個循環(huán)遍歷每一行的塊, 第二個循環(huán)遍歷當(dāng)前行的每一列塊 (參 見圖 4左邊的柵格) 。每一個塊都賦了新的顏色值,這些值都是0至 255 的隨機數(shù)。到現(xiàn)在為止,所有代碼都是非?;A(chǔ)的?,F(xiàn)在,在列循環(huán)中顏色值的下方,我們要聲明另外兩個循環(huán):for (var tr = 0; tr tileHeight; tr+) for (var tc = 0; tc tileWidth; tc+) ;根據(jù)之前計算的塊尺寸,這些循環(huán)遍歷的次數(shù)與每個塊中的像素個數(shù)相同。變量 tr 和 tc 表示當(dāng)前訪問塊的像素行(基于塊的高度)和像素列(基于塊的寬度) (參見
11、圖 4 右邊的 柵格)。在這個例子中,每一個塊的寬和高都是 125 像素,所以 tr 將會循環(huán) 125 次,而在每 一次循環(huán)中, tc 將會再循環(huán) 125 次。圖 4 循環(huán)每一個塊和塊中每一個像素然而, 我們現(xiàn)在仍然還無法訪問每一個塊中的實際像素。我們現(xiàn)在得到的是所訪問的塊的行和列(變量 r 和 c),以及你在該塊中所處的像素的行和列(變量tr 和 tc)對于它們本身而言,這些變量并不足以用來訪問 CanvasPixelArray 中的像素。為此,需要將它們轉(zhuǎn)換為 以 0 開始的像素位置坐標( x, y),就像是沒有塊存在時那樣。將下面的代碼添加到第二個循環(huán)中, 然后我將解釋會出現(xiàn)什么結(jié)果,
12、這事實上是很簡單 的:var trueX = (c*tileWidth)+tc;var trueY = (r*tileHeight)+tr;這兩個變量可以計算出像素的真實位置。 例如,要計算 x軸位置, 首先要將當(dāng)前塊的列數(shù)(2)乘以每個塊的寬度 (125),這樣就得到所訪問塊的左邊緣的 x 坐標位置 (2125=250)。然 后,再加上所訪問的塊中像素的列數(shù) (例如, 10),這樣就得到?jīng)]有塊時的 x 軸確切坐標 (250+ 10= 260)。對 y 軸重復(fù)這個過程,就可以得到開始修改像素顏色值的位置坐標(x,y)。將下面的代碼加到 trueX 和 trueY 的賦值語句后面:var pos = (trueY*(imageData.width*4)+(trueX*4);pixelspos = red;pixelspos+1 = green;pixelspos+2 = blue;pixelspos+3 = 255;這里并沒有出現(xiàn)新代碼, 它只是訪問像素的紅色顏色值, 然后使用之前設(shè)置的顏色值進 行賦值。因為這里從 0 開始計算,所以必須將 tr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年高中語文 第四單元 第17課 與妻書說課稿 粵教版必修2
- 2024年秋九年級化學(xué)上冊 第3章 物質(zhì)構(gòu)成的奧秘 第2節(jié) 組成物質(zhì)的化學(xué)元素 第1課時 元素與元素符號說課稿 滬教版
- 二零二五年度運輸車隊租賃及維保一體化服務(wù)合同2篇
- 派員擔(dān)任法定代表人協(xié)議書(2篇)
- 2024-2025版新教材高中化學(xué) 第2章 第3節(jié) 第2課時 氣體摩爾體積說課稿 新人教版必修第一冊
- 二零二五年監(jiān)護協(xié)議書:監(jiān)護職責(zé)與被監(jiān)護人的責(zé)任3篇
- 2025年度農(nóng)業(yè)機械聘用駕駛員安全協(xié)議
- 7 湯姆 · 索亞歷險記(節(jié)選) (說課稿)2023-2024學(xué)年-部編版語文六年級下冊
- 二零二五年度男方賭博離婚協(xié)議正規(guī)范本附子女成長環(huán)境保障協(xié)議
- 二零二五年度水泥磚生產(chǎn)工藝研發(fā)合作合同
- 2024年醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范培訓(xùn)課件
- DB11T 1136-2023 城鎮(zhèn)燃氣管道翻轉(zhuǎn)內(nèi)襯修復(fù)工程施工及驗收規(guī)程
- 2025屆浙江省兩校高一數(shù)學(xué)第一學(xué)期期末質(zhì)量檢測試題含解析
- 2023年新高考(新課標)全國2卷數(shù)學(xué)試題真題(含答案解析)
- 零部件測繪與 CAD成圖技術(shù)(中職組)沖壓機任務(wù)書
- GB/T 19228.1-2024不銹鋼卡壓式管件組件第1部分:卡壓式管件
- 2024年騎電動車撞傷人私了協(xié)議書范文
- 四年級數(shù)學(xué)(上)計算題專項練習(xí)及答案
- 繪本教學(xué)課件
- 2024年中國不銹鋼炒鍋市場調(diào)查研究報告
- 江蘇省南通市2023-2024學(xué)年小升初語文試卷(含答案)
評論
0/150
提交評論