免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Canvas圖像數(shù)據(jù)完全指南:從像素生成到渲染避坑

Canvas圖像數(shù)據(jù)完全指南:從像素生成到渲染避坑 剛接手一個(gè)項(xiàng)目時(shí)后端丟給我一組圖像數(shù)據(jù)要求在瀏覽器里渲染成圖。我原以為就是把接口返回的字節(jié)流貼到頁面上結(jié)果打開一看是一個(gè)巨大的數(shù)組四個(gè)數(shù)字一組代表紅、綠、藍(lán)、透明度。那一刻我才意識(shí)到Canvas的“圖像數(shù)據(jù)”鏈路跟平常寫div、寫img完全是兩回事。如果你也是剛接觸Canvas的小白這篇文章就順著這條線講清楚圖像數(shù)據(jù)到底長(zhǎng)什么樣、怎么生成、怎么渲染上屏以及我在實(shí)際項(xiàng)目中踩過的那些坑。它適合所有準(zhǔn)備上手Canvas的前端同學(xué)也適合面試前臨時(shí)補(bǔ)圖像基礎(chǔ)的人。我盡量把話說直白不繞彎子。1. 先想清楚圖像數(shù)據(jù)從哪來、到哪去1.1 別把Canvas當(dāng)畫板把它當(dāng)“數(shù)據(jù)入口”很多教程習(xí)慣把Canvas比喻成一塊畫板教你用moveTo、lineTo畫線用fillRect畫方塊。這個(gè)比喻沒有錯(cuò)但它容易讓你忽略一件更重要的事Canvas的2D上下文本質(zhì)上是一塊“像素緩沖區(qū)”。它既能接收?qǐng)D形指令也能直接暴露底層像素?cái)?shù)據(jù)。拿到一塊畫布后你有兩條路可以走。第一條是調(diào)用繪圖API畫線、填充、變換瀏覽器幫你把這些向量指令“光柵化”成像素。第二條是先拿到像素?cái)?shù)組直接往內(nèi)存里填值再通過putImageData把數(shù)據(jù)“拍”回畫布。第二種方式繞過了所有圖形API操作的是最底層的像素本身。我后來做圖像處理類的功能幾乎全是走第二條路。原因很簡(jiǎn)單圖像數(shù)據(jù)一旦變成數(shù)組就能用JavaScript做任意數(shù)學(xué)運(yùn)算灰度、反色、縮放、降噪、卷積全都可以自己實(shí)現(xiàn)而且邏輯非常透明。相比之下依賴Canvas內(nèi)置API做復(fù)雜圖像處理反而束手束腳。const canvas document.createElement(canvas); canvas.width 200; canvas.height 100; const ctx canvas.getContext(2d);上面這段代碼創(chuàng)建了一塊200乘100像素的畫布。這里的width和height指的是像素矩陣的尺寸跟CSS里寫的寬高是兩碼事。很多人搞混這一點(diǎn)后面會(huì)專門講。1.2 一張圖在內(nèi)存里長(zhǎng)什么樣圖像數(shù)據(jù)在內(nèi)存里是按像素逐行排列的。每個(gè)像素由4個(gè)字節(jié)組成分別對(duì)應(yīng)紅色、綠色、藍(lán)色和透明度Alpha。所以一張寬w、高h(yuǎn)的圖片像素?cái)?shù)組的長(zhǎng)度一定是w * h * 4。位深通常是8位也就是每個(gè)通道的取值范圍是0到255。0表示沒有該顏色或完全透明255表示顏色最強(qiáng)或完全不透明。透明度通道比較特殊255是完全不透明0是完全透明。這跟一些設(shè)計(jì)軟件里“Alpha越大越透明”的直覺相反我第一次寫的時(shí)候反過來了。數(shù)組里具體怎么排假設(shè)圖片寬3像素、高2像素那么內(nèi)存數(shù)據(jù)是這樣的前4個(gè)數(shù)字是左上角第一個(gè)像素的RGBA接著4個(gè)數(shù)字是它右邊相鄰像素的RGBA一行走完后再換下一行。像素坐標(biāo)和數(shù)組索引的換算關(guān)系是固定的const idx (y * width x) * 4; const red data[idx]; const green data[idx 1]; const blue data[idx 2]; const alpha data[idx 3];這個(gè)公式就是圖像數(shù)據(jù)操作的心臟。無論你是生成圖像、做濾鏡、還是做像素級(jí)別的特效都繞不開它。我見過很多同學(xué)拿到data數(shù)組后直接data[i]當(dāng)像素用導(dǎo)致顏色錯(cuò)亂得離譜其實(shí)就是少乘了個(gè)4。1.3 為什么是Uint8ClampedArray0到255背后的原因你可能會(huì)好奇為什么圖像數(shù)據(jù)的類型是Uint8ClampedArray而不是普通數(shù)組或者Uint8Array。這里有兩個(gè)點(diǎn)要理解。第一類型化數(shù)組是為性能設(shè)計(jì)的。普通JavaScript數(shù)組可以存任意類型內(nèi)部結(jié)構(gòu)復(fù)雜訪問慢。而Uint8ClampedArray里每個(gè)元素只占1個(gè)字節(jié)內(nèi)存緊湊讀寫快。圖像動(dòng)輒上百萬像素用普通數(shù)組存會(huì)非常浪費(fèi)。第二Clamped的意思是“鉗制”。往這個(gè)數(shù)組里賦超過255的值會(huì)被自動(dòng)截?cái)喑?55賦負(fù)數(shù)會(huì)被截?cái)喑?。比如你寫了一行data[0] 300讀取的時(shí)候它已經(jīng)是255了不會(huì)像普通數(shù)組那樣保留300。這個(gè)行為在圖像處理里非常實(shí)用。做卷積、疊加素材時(shí)計(jì)算結(jié)果很容易超出合法范圍如果每次手動(dòng)判斷邊界代碼會(huì)很難看。Clamped數(shù)組幫你兜底那些越界值不會(huì)污染渲染結(jié)果。但如果需要保留中間計(jì)算精度就不能直接用Uint8ClampedArray存中間值得換成Float32Array最后再轉(zhuǎn)回來。我自己的習(xí)慣是中間計(jì)算用普通數(shù)組或Float32Array寫回ImageData前再統(tǒng)一轉(zhuǎn)成Uint8ClampedArray。2. 從零生成圖像數(shù)據(jù)直接抄的代碼與思路2.1 最小可用流程先建數(shù)據(jù)再寫像素生成圖像數(shù)據(jù)只需要兩步創(chuàng)建一個(gè)空的ImageData往里填像素然后把ImageData放回畫布。創(chuàng)建ImageData有兩種方式效果等價(jià)。// 方式一直接構(gòu)造 const imageData new ImageData(100, 100); // 方式二通過上下文創(chuàng)建 const imageData ctx.createImageData(100, 100);兩者的區(qū)別其實(shí)很小。new ImageData不依賴任何Canvas對(duì)象適合在Worker線程或純計(jì)算環(huán)境里用。ctx.createImageData是Canvas 2D上下文提供的方法樣式上更貼近畫布操作。兩種方式創(chuàng)建的ImageData初始狀態(tài)都是全透明黑色也就是RGBA全是0。填像素時(shí)核心就是給data數(shù)組的每個(gè)位置賦值。比如我要在(10, 20)這個(gè)坐標(biāo)畫一個(gè)純紅不透明的點(diǎn)const x 10; const y 20; const idx (y * imageData.width x) * 4; imageData.data[idx] 255; // R imageData.data[idx 1] 0; // G imageData.data[idx 2] 0; // B imageData.data[idx 3] 255; // A把data數(shù)組填好后調(diào)用putImageData就能看到結(jié)果。注意putImageData的第一個(gè)參數(shù)是ImageData第二、第三個(gè)參數(shù)是目標(biāo)坐標(biāo)表示從畫布的哪個(gè)位置開始覆蓋。ctx.putImageData(imageData, 0, 0);這一步做完圖像就已經(jīng)在屏幕上了。整個(gè)過程不涉及任何跟圖片文件相關(guān)的操作純靠?jī)?nèi)存數(shù)據(jù)生成畫面。2.2 生成一張漸變背景理解了像素坐標(biāo)和索引的換算生成漸變就非常簡(jiǎn)單。漸變本質(zhì)上就是“位置變化導(dǎo)致顏色變化”。我們讓紅色通道的值隨y坐標(biāo)線性變化越往下越紅就能得到一個(gè)垂直紅色漸變。function generateGradient(w, h) { const imageData new ImageData(w, h); const data imageData.data; for (let y 0; y h; y) { for (let x 0; x w; x) { const idx (y * w x) * 4; data[idx] Math.floor((y / h) * 255); // R隨y漸變 data[idx 1] 100; // G固定 data[idx 2] 200; // B固定 data[idx 3] 255; // 完全不透明 } } return imageData; }生成后直接ctx.putImageData(generateGradient(400, 200), 0, 0)就能看到一條從黑到紅的漸變。這里有兩個(gè)性能相關(guān)的細(xì)節(jié)。第一循環(huán)里面做了除法再取整如果圖特別大可以考慮把(y / h) * 255提到內(nèi)層循環(huán)外面因?yàn)橥恍兴邢袼氐倪@個(gè)值是一樣的。第二如果一行像素顏色完全相同可以用data.fill()或者data.set()一次性填充一段連續(xù)區(qū)域比逐像素賦值快很多。2.3 用算法生成紋路噪點(diǎn)、條紋與粒子圖像數(shù)據(jù)的趣味性在于任何數(shù)學(xué)公式都能變成畫面。比如生成隨機(jī)噪點(diǎn)全圖每個(gè)像素隨機(jī)RGB效果就像老電視的雪花屏for (let y 0; y h; y) { for (let x 0; x w; x) { const idx (y * w x) * 4; data[idx] Math.random() * 255; data[idx 1] Math.random() * 255; data[idx 2] Math.random() * 255; data[idx 3] 255; } }如果把隨機(jī)改成取模運(yùn)算就能生成條紋。下面這個(gè)例子用x % 64 32作為黑白判斷得到等間距的豎直條紋for (let y 0; y h; y) { for (let x 0; x w; x) { const idx (y * w x) * 4; const v (x % 64 32) ? 255 : 0; data[idx] v; data[idx 1] v; data[idx 2] v; data[idx 3] 255; } }我經(jīng)常用這種方式快速生成占位圖、測(cè)試紋理和動(dòng)畫背景。原理都一樣確定坐標(biāo)算出顏色寫進(jìn)數(shù)組。你甚至可以讀一張真實(shí)的圖片遍歷它的像素按自己的規(guī)則重新映射顏色做風(fēng)格化濾鏡。2.4 完整示例把圖像數(shù)據(jù)渲染上屏把前面幾段拼起來就是一套完整的“從數(shù)據(jù)到屏幕”流程。新建一個(gè)HTML文件直接打開就能看到效果!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleCanvas 圖像數(shù)據(jù)示例/title /head body canvas idscreen width320 height180/canvas script const canvas document.getElementById(screen); const ctx canvas.getContext(2d); const w canvas.width; const h canvas.height; const imageData new ImageData(w, h); const data imageData.data; for (let y 0; y h; y) { for (let x 0; x w; x) { const idx (y * w x) * 4; data[idx] Math.floor((x / w) * 255); data[idx 1] Math.floor((y / h) * 255); data[idx 2] 128; data[idx 3] 255; } } ctx.putImageData(imageData, 0, 0); /script /body /html這段代碼生成了一張水平由黑到紅、垂直由黑到綠的漸變圖。紅綠混合后畫面會(huì)呈現(xiàn)從黑到黃再到橙色的過渡。你可以試著把固定值改成其他算法畫面會(huì)立即跟著變。3. 渲染上屏的路徑選擇從像素到圖片全流程3.1 putImageData原樣覆蓋不做任何加工putImageData 是最直接的“上屏”方式。它把ImageData里的像素原封不動(dòng)地寫到畫布上不做縮放、不做合成、不受Canvas當(dāng)前變換影響。也就是說即使你之前調(diào)用了ctx.scale(2, 2)putImageData 也不會(huì)被放大2倍。這個(gè)特性既是優(yōu)點(diǎn)也是陷阱。優(yōu)點(diǎn)在于數(shù)據(jù)精確適合圖像處理類任務(wù)陷阱在于如果你想對(duì)圖像做縮放直接調(diào)用putImageData是做不到的。實(shí)際項(xiàng)目中我常常把ImageData先放進(jìn)一個(gè)離屏Canvas再用drawImage去縮放、旋轉(zhuǎn)、合成。這個(gè)流程下一步講。另一個(gè)需要注意的點(diǎn)是putImageData是“覆蓋”操作。它會(huì)用你傳入的ImageData矩形區(qū)域直接覆蓋畫布上對(duì)應(yīng)坐標(biāo)的內(nèi)容。如果ImageData包含透明像素那透明部分也會(huì)覆蓋掉底下的內(nèi)容而不是跟下面做Alpha混合。所以當(dāng)你要把圖像數(shù)據(jù)疊加到已經(jīng)畫好的背景上時(shí)請(qǐng)先想清楚是想要覆蓋還是想要合成。覆蓋用putImageData合成用drawImage。3.2 drawImage把數(shù)據(jù)變成可以繼續(xù)創(chuàng)作的“素材”drawImage是Canvas 2D里最靈活的上屏方式之一。它接收Image、Canvas或Video對(duì)象作為源圖。我們可以把圖像數(shù)據(jù)先寫入一個(gè)隱藏Canvas再通過drawImage把它畫到目標(biāo)Canvas上。這樣做的好處是drawImage支持縮放、旋轉(zhuǎn)、透明度調(diào)整還能參與合成模式。比如我想把一張320x180的圖像數(shù)據(jù)放大兩倍顯示在頁面上// 離屏Canvas用于承載圖像數(shù)據(jù) const offscreen document.createElement(canvas); offscreen.width 320; offscreen.height 180; const offCtx offscreen.getContext(2d); offCtx.putImageData(imageData, 0, 0); // 目標(biāo)Canvas放大繪制 const target document.getElementById(screen); const ctx target.getContext(2d); ctx.drawImage(offscreen, 0, 0, 640, 360);這里把離屏Canvas當(dāng)作一張“內(nèi)存里的圖片”drawImage時(shí)一次性完成放大。放大必然產(chǎn)生像素插值所以邊緣會(huì)比原始像素?cái)?shù)據(jù)稍微模糊一些這是正?,F(xiàn)象。如果你需要把圖像數(shù)據(jù)跟已有畫面疊加合成也可以先drawImage畫背景再drawImage畫圖像數(shù)據(jù)。兩者可以相互配合組合出比單用putImageData豐富得多的效果。3.3 導(dǎo)出圖片toDataURL與toBlob怎么選圖像數(shù)據(jù)不一定只在屏幕上給人看經(jīng)常還要導(dǎo)出成圖片文件上傳到服務(wù)器或者讓用戶下載。Canvas提供了兩個(gè)導(dǎo)出接口toDataURL和toBlob。// 同步生成base64數(shù)據(jù)URL const dataUrl canvas.toDataURL(image/png); // 異步生成Blob回調(diào)接收 canvas.toBlob((blob) { // blob 可以用于上傳或創(chuàng)建下載鏈接 }, image/png, 0.9);兩者的核心區(qū)別在于toDataURL是同步的大圖轉(zhuǎn)換時(shí)會(huì)卡住主線程toBlob是異步的不阻塞渲染。在Web Worker不可用的場(chǎng)景里導(dǎo)出2K、4K大圖時(shí)我一般優(yōu)先toBlob。拿到Blob后想觸發(fā)瀏覽器下載標(biāo)準(zhǔn)做法是創(chuàng)建ObjectURL再模擬點(diǎn)擊canvas.toBlob((blob) { const url URL.createObjectURL(blob); const a document.createElement(a); a.href url; a.download image.png; a.click(); URL.revokeObjectURL(url); }, image/png);導(dǎo)出格式要注意PNG支持透明背景JPEG不支持透明通道透明區(qū)域會(huì)被強(qiáng)制壓成黑色。很多同學(xué)導(dǎo)出JPEG后抱怨“背景變黑了”原因就在這里。解決辦法是導(dǎo)出前先給Canvas填充一個(gè)白色背景比如ctx.fillStyle #fff; ctx.fillRect(0, 0, w, h);然后再把原內(nèi)容畫上去。3.4 大圖的性能優(yōu)化離屏Canvas與Worker純像素操作一旦碰上大圖性能問題立刻暴露。比如處理2048x2048的圖像每幀都要遍歷400多萬像素主線程就算只算一次也會(huì)有明顯卡頓。優(yōu)化方向有兩個(gè)離屏Canvas和OffscreenCanvas。離屏Canvas是常規(guī)優(yōu)化。把反復(fù)繪制的靜態(tài)內(nèi)容放進(jìn)隱藏Canvas主畫布只做拷貝省去重復(fù)計(jì)算和繪制。這個(gè)技術(shù)成本低、收益大幾乎適用于所有Canvas場(chǎng)景。// 離屏Canvas緩存靜態(tài)背景 const bgCanvas document.createElement(canvas); bgCanvas.width 1920; bgCanvas.height 1080; const bgCtx bgCanvas.getContext(2d); // ...繪制靜態(tài)內(nèi)容 // 每幀只需拷貝 ctx.drawImage(bgCanvas, 0, 0);OffscreenCanvas更進(jìn)一步它可以脫離DOM運(yùn)行在Web Worker里。Worker沒有主線程壓力非常適合做像素?cái)?shù)據(jù)生成、濾鏡計(jì)算這類CPU密集任務(wù)。計(jì)算完成后把像素?cái)?shù)據(jù)或OffscreenCanvas轉(zhuǎn)移回主線程再渲染上屏。// 主線程 const offscreen new OffscreenCanvas(w, h); worker.postMessage({ canvas: offscreen }, [offscreen]); // Worker線程 self.onmessage function(e) { const canvas e.data.canvas; const ctx canvas.getContext(2d); // 在Worker里做像素計(jì)算... self.postMessage(canvas, [canvas]); };初次接觸可能會(huì)困惑OffscreenCanvas怎么傳到Worker的關(guān)鍵就在postMessage的第二個(gè)參數(shù)傳的是一個(gè)Transferable列表。Canvas被轉(zhuǎn)移后主線程就不再持有它這是零拷貝的移動(dòng)方式性能遠(yuǎn)高于結(jié)構(gòu)體克隆。4. 小白避坑實(shí)錄最容易翻車的6個(gè)問題4.1 跨域圖片導(dǎo)致getImageData報(bào)錯(cuò)我用一段線上圖片生成圖像數(shù)據(jù)時(shí)第一次就碰上了 SecurityError。原因是Canvas被“污染”了你往Canvas上畫了一張跨域圖片瀏覽器為了保證用戶隱私禁止你調(diào)用getImageData讀取像素。這個(gè)策略跟圖片顯示本身無關(guān)圖片能正常顯示但讀取數(shù)據(jù)被禁。解決辦法是加載圖片時(shí)設(shè)置crossOrigin anonymous同時(shí)服務(wù)器必須返回Access-Control-Allow-Origin響應(yīng)頭。兩個(gè)條件缺一不可。比如使用圖片const img new Image(); img.crossOrigin anonymous; img.onload function() { ctx.drawImage(img, 0, 0); const data ctx.getImageData(0, 0, w, h); }; img.src https://example.com/image.jpg;如果圖片服務(wù)不支持CORS那么Canvas被污染后沒有客戶端繞過的辦法只能在服務(wù)端做代理或要求源站加響應(yīng)頭。另外一個(gè)細(xì)節(jié)用file://協(xié)議直接打開本地HTML即使圖片也在本地很多瀏覽器同樣會(huì)報(bào)跨域錯(cuò)誤。調(diào)試時(shí)最好起一個(gè)本地HTTP服務(wù)比如npx serve別用雙擊文件的方式。4.2 設(shè)置canvas.width導(dǎo)致畫布被清空我在寫一個(gè)響應(yīng)式Canvas組件時(shí)踩過這個(gè)坑監(jiān)聽到窗口尺寸變化后動(dòng)態(tài)給canvas.width賦值結(jié)果整個(gè)畫布突然全沒了。實(shí)際上設(shè)置 canvas.width 或 canvas.height 會(huì)清空畫布內(nèi)容同時(shí)重置Canvas的全部繪圖狀態(tài)包括當(dāng)前變換矩陣、合成模式等。這不是bug是規(guī)范行為。想動(dòng)態(tài)調(diào)整尺寸時(shí)要在賦值之后重新執(zhí)行所有繪制邏輯包括重新設(shè)置樣式和重畫內(nèi)容。如果項(xiàng)目里涉及窗口縮放建議把繪制流程封裝成一個(gè)統(tǒng)一的render()函數(shù)尺寸變化時(shí)先改寬高再調(diào)用render()。另外頻繁修改canvas尺寸會(huì)觸發(fā)昂貴的底層緩沖區(qū)重新分配。一次會(huì)話里盡量把尺寸設(shè)置到位不要在一幀里反復(fù)改。4.3 高分屏模糊與CSS尺寸常規(guī)前端里為了讓Canvas適配高清屏很多人直接設(shè)canvas.width 800; canvas.height 600然后用CSS把它縮放到小尺寸顯示。這樣做在小屏幕上會(huì)糊。因?yàn)闉g覽器的物理像素比CSS像素細(xì)Canvas默認(rèn)按CSS像素渲染渲染結(jié)果再被視網(wǎng)膜屏放大自然就模糊了。標(biāo)準(zhǔn)做法是const dpr window.devicePixelRatio || 1; canvas.width cssWidth * dpr; canvas.height cssHeight * dpr; ctx.scale(dpr, dpr);繪圖時(shí)按CSS尺寸的邏輯坐標(biāo)操作瀏覽器會(huì)負(fù)責(zé)把實(shí)際像素映射到高清屏。但要注意putImageData是像素級(jí)別的操作它不認(rèn)transform。如果想讓圖像數(shù)據(jù)本身在高清屏上保持銳利要么生成尺寸為物理像素大小的ImageData要么把ImageData放進(jìn)離屏Canvas再用drawImage繪制。我自己傾向于后者因?yàn)閐rawImage會(huì)正確處理dpr變換。4.4 像素索引錯(cuò)位data[i]到底對(duì)應(yīng)哪個(gè)點(diǎn)最常見的bug是把data[i]當(dāng)成第 i 個(gè)像素。前面說過數(shù)組每個(gè)像素占4個(gè)位置所以遍歷像素時(shí)步長(zhǎng)必須是4。許多人寫for (let i 0; i data.length; i)然后把每個(gè)字節(jié)都當(dāng)成一個(gè)像素結(jié)果圖變成了一堆雜亂豎條紋。正確的遍歷模式只有一種要么外層循環(huán)坐標(biāo)內(nèi)層算索引乘4要么步長(zhǎng)為4的循環(huán)。推薦前者可讀性好。for (let y 0; y h; y) { for (let x 0; x w; x) { const idx (y * w x) * 4; // 操作 data[idx] ~ data[idx 3] } }調(diào)試這類問題有個(gè)技巧先只設(shè)置一個(gè)像素為不透明白色其余全黑如果能看到一個(gè)白點(diǎn)出現(xiàn)在預(yù)期位置說明坐標(biāo)換算是對(duì)的如果白點(diǎn)出現(xiàn)在完全相反的位置那大概率是x和y寫反了或者row stride算錯(cuò)了。4.5 putImageData之后“沒變化”的幾個(gè)原因有人寫完像素?cái)?shù)組后調(diào)用putImageData發(fā)現(xiàn)畫面毫無變化就以為是自己代碼錯(cuò)了。我總結(jié)過這類問題最常見的三種情況第一你通過getImageData從Canvas里讀取了數(shù)據(jù)修改了data數(shù)組但沒有調(diào)用putImageData寫回去。修改data數(shù)組本身只是在內(nèi)存里改Canvas表面不會(huì)自動(dòng)更新。必須顯式putImageData才能讓改動(dòng)上屏。第二putImageData的目標(biāo)坐標(biāo)或?qū)捀叱隽水嫴挤秶utImageData不做裁剪超出范圍的部分會(huì)直接不顯示。如果你用了一張320x180的數(shù)據(jù)放到200x100的畫布上超出底部的部分就看不到。第三ImageData寬高跟Canvas寬高不一致。很多同學(xué)創(chuàng)建ImageData時(shí)沒注意寬高導(dǎo)致畫布上只顯示了一部分。排查時(shí)可以先打印imageData.width、imageData.height和目標(biāo)Canvas的寬高關(guān)系再看putImageData的坐標(biāo)參數(shù)問題很容易定位。4.6 導(dǎo)出圖片黑底、透明丟失與內(nèi)存爆炸前面提到JPEG導(dǎo)出透明區(qū)域會(huì)變黑這是最常碰到的導(dǎo)出坑。除了先填充白底另一個(gè)方案是判斷用戶的導(dǎo)出需求如果產(chǎn)品只需要背景色可以把背景色填充為產(chǎn)品主題色而不是純白視覺效果更好。內(nèi)存方面也要留意。一張4096x4096的畫布ImageData數(shù)組長(zhǎng)度就是4096乘4096乘4約6700萬個(gè)字節(jié)差不多64MB。如果再同時(shí)保留多個(gè)ImageData副本、幾個(gè)Canvas緩存內(nèi)存很容易突破幾百M(fèi)B。移動(dòng)端更明顯頁面會(huì)直接白屏或崩潰。處理原則是能復(fù)用就復(fù)用不用的ImageData盡早置空引用大尺寸導(dǎo)出時(shí)用toBlob異步做別讓主線程長(zhǎng)時(shí)間卡死復(fù)雜計(jì)算挪到Worker層。5. 從“數(shù)據(jù)”到“生產(chǎn)力”進(jìn)階玩法與真實(shí)場(chǎng)景5.1 三行代碼實(shí)現(xiàn)灰度濾鏡圖像數(shù)據(jù)最大的價(jià)值是可以用JavaScript直接做圖像處理。比如灰度化只需要把每個(gè)像素的RGB替換成亮度值。亮度公式不是簡(jiǎn)單的取平均而是按人眼敏感度加權(quán)const gray r * 0.299 g * 0.587 b * 0.114;綠色占比最高因?yàn)槿搜蹖?duì)綠色最敏感藍(lán)色占比最低。用這個(gè)公式得到的灰度更符合視覺感受。完整實(shí)現(xiàn)就是把一副畫布內(nèi)容讀出來遍歷像素寫入新值再放回去const imageData ctx.getImageData(0, 0, w, h); const data imageData.data; for (let i 0; i data.length; i 4) { const gray data[i] * 0.299 data[i 1] * 0.587 data[i 2] * 0.114; data[i] gray; data[i 1] gray; data[i 2] gray; } ctx.putImageData(imageData, 0, 0);反色更簡(jiǎn)單每個(gè)通道用255減原值。這兩個(gè)例子看起來簡(jiǎn)單但它們是所有圖像處理算法的基礎(chǔ)。前端面試題里如果讓你實(shí)現(xiàn)濾鏡或者圖像處理核心考的就是這三個(gè)能力拿數(shù)據(jù)、算數(shù)據(jù)、寫數(shù)據(jù)。5.2 圖像數(shù)據(jù)在項(xiàng)目里的真實(shí)應(yīng)用走出demo圖像數(shù)據(jù)在業(yè)務(wù)里其實(shí)有非常多的用武之地。工業(yè)檢測(cè)里采集到的圖像經(jīng)常需要前端先做預(yù)處理再上傳比如裁剪、壓縮、加標(biāo)注。你把像素?cái)?shù)據(jù)遍歷一遍去掉無效區(qū)塊再導(dǎo)出成小圖上傳能省下大量帶寬。界面開發(fā)里有時(shí)需要根據(jù)業(yè)務(wù)數(shù)據(jù)動(dòng)態(tài)生成背景紋理。比如把服務(wù)器返回的一組數(shù)值映射成色塊生成熱力圖。ImageData天然適合這種場(chǎng)景數(shù)值高就偏紅數(shù)值低就偏藍(lán)一個(gè)循環(huán)搞定。桌面端開發(fā)里如果你用Electron這類框架渲染進(jìn)程和主進(jìn)程之間傳數(shù)據(jù)時(shí)會(huì)涉及類型化數(shù)組。ImageData的data數(shù)組本質(zhì)上是ArrayBuffer的視圖可以把它轉(zhuǎn)移或克隆給主進(jìn)程使用。這個(gè)鏈路跟普通前端里Canvas像素處理一模一樣只是多了一層進(jìn)程間通信。還有一類很有意思的應(yīng)用是像素畫生成器。把文字、ID或者任意字符串通過哈希算法映射成一串?dāng)?shù)值再按規(guī)則填進(jìn)ImageData就能生成獨(dú)一無二的抽象圖案。這種“數(shù)據(jù)變圖像”的思路很適合做簽名、驗(yàn)證碼周邊或者生成視覺化身份標(biāo)識(shí)。5.3 我留給自己的雞生蛋思路如果讓我給一個(gè)剛接觸Canvas的新手規(guī)劃學(xué)習(xí)路線我會(huì)建議先放棄花哨的繪圖API老老實(shí)實(shí)從ImageData做起。因?yàn)槔斫饬讼袼財(cái)?shù)組你就理解了Canvas的底層邏輯反過來看那些花哨API多數(shù)就是“幫你把像素運(yùn)算封裝好”。我自己做圖像類功能時(shí)固定套路是三步先確定數(shù)據(jù)格式再?zèng)Q定要不要放在離屏Canvas處理最后才考慮上屏方式。如果性能要求高再評(píng)估是否上OffscreenCanvas加Worker。這個(gè)套路幫我避免了大部分“寫一半發(fā)現(xiàn)架構(gòu)不對(duì)”的問題。最后分享一個(gè)小技巧當(dāng)你需要反復(fù)生成、處理圖像數(shù)據(jù)時(shí)把“像素坐標(biāo)換算成數(shù)組索引”抽成工具函數(shù)放進(jìn)工具庫比如getPixelIndex(x, y, width)。你會(huì)發(fā)現(xiàn)幾乎所有圖像代碼都要用到它抽出來之后代碼會(huì)變得干凈很多。Canvas這條路入門門檻不高但真正要寫出可靠、高性能的圖像處理模塊細(xì)節(jié)全在這些日常積累里。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
www.色九月| 这里只有精彩亚洲视频推荐| 99色综合| 丁香五月欧美| 深爱丁香激情| 综合网色| 丁香五月婷婷婷桃花影院| nvrentiantang av| 五月花亭亭| 久人人操| 日韩专区五月天婷婷丁香| 激情五月婷婷色色| 久久思思热| 久久人妻在线| 丁香五月成人论坛| 天天操天天日天天爱| 少妇人妻偷人精品无码视频新浪| 开心五月婷婷| 亚洲区1| 丁香五月天激情视频| 91热在线| 99九九视频| 色欲一区二区三区精品A片| 成功精品影院| 热99这就是精品视频| 成人天天爽| 国产亚洲99久久精品熟| 黑人巨粗进入警花疼哭A片| 五月婷婷在线免费观看| 五月丁香六月婷婷婷婷| a v色婷婷| 午夜AV网| 第四色在线观看| 国产精品香蕉| 色丁香五月婷婷在线| 欧美va亚洲va| 只有精品视频在线观看| 婷婷久久久| 狠狠精品干练久久久无码中文字幕 | 99久久玖玖| 五月婷婷免费在线| 激情综合女人网五月播播| 视频1区2区| 人妻激情久久| 91碰人人| 99热黄| 99热这里只有精品在线| 五月丁香综合啪啪| 另类图片五月天| 久热婷婷| 五月天婷婷丁香| 色五月婷婷一二| 天天爽天天透天天爱| 亚洲人妻av| 97热在线精品| av久热| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 色综合五月天| 亚洲成人AV电影在线| 伊人久久艹| 九九久久99精品免费观看www| 婷婷干五月综合在线播放| 丁香婷婷偷拍| 欧美草久久五月天91| 婷婷综合五月激情| 色婷婷五月天小说网| 激情综合4月| 久久久五月五丁香| 国产日批视频免费播放| 丁香五月激情欧欧美| 六月丁香婷婷拍拍| 丁香六月婷婷色XXXX| 丁香开心深爱| 9999热精品在线免费播放| 激情 婷婷| 九九综舍久久| 精品五月丁香| 人人爽欧美婷婷久久久五月丁香 | 久久人妻视频| 99久久天堂婷婷| av首页在线| 另类婷婷五月天啪帕帕| 91大神操美女| 婷婷 激情 五月| 亚洲激情无码久久| 99热6精品| 99热| 乱岳熟女50岁| WWW免费视频碰碰碰碰| 伊人综合婷婷| 欧美婷婷五月激情| 午夜爱爱网站| 丁香性爱在线视频| 五月婷婷婷综合网| 丁香五月天欧美在线| 五月丁香婷在线| 99热无码首页| 婷婷综合五月| 日本人人草草| 丁香五月在线视频黑人| 五月婷色色| 婷婷伊人网| 国自产拍偷拍精品啪啪一区二区| 午夜丁香综合婷婷| 97色婷婷五月天| 丁香五月成人婷婷| 丁香花社区av| 玖玖资源站国产| 婷婷五月丁香伊人网| 天天摸色吧天天摸色吧| 精品无码久久久久久久久| www.91五月| 中文字幕网站在线观看| 91啪级电影| 九九热最新地址| 色欲婷婷五月天| 亚洲精品久久久久久久久久飞鱼| 五月婷婷深深爱| 色婷婷最爱五月| 欧美中文五月天| 开心五月激情网| 国产美女无遮挡裸体毛片A片| 午夜天堂一区人妻| 三级三久久线久久99久目本WW| www激情网| 日本欧美成人片AAAA| 丁香五月六月综合激情| 婷婷久久五月天丁香| 六月丁香综合999| 99热资源在线| 婷婷五月丁香色播| 久久 视频这里只有精总| 五月婷婷香| 丁香婷婷婷婷十二月在线观看视频| 成人AV在线网站| 日日操日日爽| www.久操| 色XX综合网| 欧美成人精品A片免费一区99| 另类亚洲视频| 色五月丁香婷婷久草| 国产精品一区在线观看你懂的| 五月天停停日日| 九六五月天婷婷| 91操操| 五月丁香花激情综合网| 激情网五月天| 九九九九大香蕉| 亚洲bt丁香五月天婷婷激情小说| 2025神马午夜福利| 色婷婷影音| 成人 在线 日韩| 综合久久伊人| 亚洲无码99| 久久九久久| 操操操av| 91人在线观看| 丁香婷婷色情社区成人小说| 综合 蜜月 婷婷| 亚洲综合在线丁香五月| 天天射天天操天天干| 综合99在线| 婷婷深爱五月| 深爱开心激情网| 99热精品中文字幕| 九九操综合网| 丁香六月青青草| 亚洲久久激情| 亚洲不卡| 99re6在线视频精品免费| 色色色在线播放| 99re热精品在线视频| 99色精品| 色五月综合激情| 九九伊人网| 天天综合网91| AA片在线观看视频在线播放| 99思思热只有在这里看| 激情亭亭五月| 夜夜操夜夜操| 五月亭亭六月激情| 五月婷婷之综合激情在线| 69色色视频| 丁香婷婷浪潮AV久久综合| 狠狠撸激情综合丁香五月天俺来啦| AV大片在线播放| 丁香5月啪啪| av一级棒av| 九九婷婷五月天影视| 亚洲精品五月| 色色9 9| 日日操夜夜爽天天天| 亚洲乱码日产精品BD| 色 五月婷婷基地| 婷婷五月丁香基| 五月天另类小说久久小说网| 久热AA| 亚洲超碰在线| 激情五月天色婷婷综合| 超碰97干| 人与禽A片啪啪| 丁香婷婷在线| 九九aV| 99色综合| 播五月,色五月,开心五月播放器 | 五月激情综合美女久久| 婷婷五月深情丁香深爱日韩| 婷婷97C| 庭庭久久内射| 亚洲成人无码专区| 五月天色色网站| 婷婷九月激情| 婷婷射综合| 色999五月色| 五月天婷婷视频30| 丁香婷婷五月天亚洲| 精品人妻在线免费观看| 日日日日日| 97热这里精品在线视频| 久久加勤综合| 五月天色丁香| 丁香 久久| 成人小说 五月天 婷婷| www.超碰在线| 五月天丁香欧美激情| 色五月首页| 天天操屄网| 婷婷丁香69精华| 日本欧美999久久久三级片| 二色av| 久热网在线视频| 可以免费观看的av网址| 狼人婷婷综合| 六月丁香激情| 色综合色综合色综合| 性爱视频久久| 91丨九色丨熟女|新版| 久久99成人性爱高清视频| WWW色色色COm| AV动漫不卡无码免费| 色色欧美。| 五月丁香六月在线| 色五月色五天色情网| 亭亭五月天黑人2014| 九九伊人网| 91操在线观看| 婷婷色色欧美| 超碰网站在线观看| 色涩影院六月丁香| 婷婷久久伊人| 在线伦子99热| 麻豆精品| 午夜丁香六月婷| 亚洲传媒在线观看| 久草婷妨| 大香蕉在线观看9| 国产精产国品一二三在观看| 色伦专区97中文字幕| 99无码视频| 婷婷欧美| PORNY九色9l自拍视频成人| 九九在线这里只有精品视频 | 国产欧美日韩综合精品一区二区| 99热久| 激情五月天婷婷五月天| 婷婷五月影院| 国产肥白大熟妇BBBB视频| 色婷久久| 久久综合九色综合97婷婷| 日日操夜夜撸| 国产69精品久久久久999小说| 五月丁香色色网| 五月丁香婷婷基地| 国产AV一区二区三区最新精品| 六月婷婷开心| 久久99国产综合精品免费| 色香欲综合| 91碰碰| 97色婷婷| 牛牛热这里只有jingpin| 五月开心网| 丁香五月天社区| 丁香五月五月婷婷| 国产XXXX搡XXXXX搡麻豆| 亚洲亚洲人成综合网络| 成人va在线| 综合精品99| 五月日韩中文字幕| 人人超碰99| 激情婷婷五月天丁香| 国产美女主播vip| 伊人色综合久久久| 区区久久妻| 丁香五月图片| 色丁香影院| 婷婷五月激情天| 五月天婷婷综合| 日熟女| 五月丁香啪啪综合| 久久久久9久无码视频| chaopeng在线人人| 久久婷婷精品| 婷婷五亚洲| 俺去也婷婷| 91精品久久久久| 国内外色色色色色成人视频| 影音先锋五月天婷婷丁香在线观看| 色婷婷五月天无码视频| 日韩中文欧美| 婷婷五月丁香基地| 色噜噜婷婷| 91精品91久久久久77777| 婷婷五月中文在线| 色婷婷婷婷五月天| 99热免费| 婷婷五亚洲| 开心婷婷五月天激情网| 成人丁香| 丁香五月天论坛| 狠狠干狠狠干| 日本无va视频| 五月激情小说| 江苏少妇性BBB搡BBB爽爽爽| 超碰人人91| 五月婷婷与六月丁香图片激情| 色情激情五月| 99热这里只有精品在线观看| 91久久九色| 综合亚洲色色| 五月丁香久人妻中文| 97天堂| 五月婷久草| www.婷婷五月天,com| 激情激情激情网| 婷婷五月激情的图片| www.9797国产| 五月色激情综合网| 热99热9| 色情五月婷婷| 色吊丝永久访问网址| 深爱激情小说五月婷婷| 婷婷五月天伊人网| 大香蕉九九热| 色五月婷婷影院| 精品夜夜澡人妻无码AV| 五月婷婷无码| 成人av免费观看| 激情超碰网| 亚州激情网| www.97碰碰com| 蜜乳AV成人| 大波美女VA网站| 免费黄色AV| 久久精品五月| 26uuu欧美激情另类| 91超碰人人操| 多精窝99在线视频| 91丨九色丨大屁股| 99热免费网站| 日韩婷婷| 秋霞学生妹一二级| 色婷婷基地 | 五月婷婷深深的爱| 成人精品在线观看| 丁香五月婷婷动漫| 97在线观看| 26UUU成人网| www.99视频| 91人人澡人人爽人人看| 成人在线视频一区| 五月叮香啪| 日韩aⅴ视频| 99热这里只有精品一| 久青草影院| 欧美日韩成人在线| 色五月婷婷中文字幕| 国产免费AV网站| 超碰人人超碰| 二级黄色毛片| 久久久激情| 最新色色五月天| 九色91视频| 99ri久久| 在线另类| 丁香婷婷久久老熟女综合网| 另类图片五月天激情| 五月丁香六月婷婷国产视频| 婷婷趴趴| 五月天婷婷久久| 丁香五月婷婷亚洲色图| 五月婷婷色在线| 五月婷综合网| 欧美色碰| 99热精品在线观看| 婷婷激情五月综合丁香社| 激情操逼婷婷| 日本色色网站| 九九免费精品在线视频| 九九色video| 岛国av网站| 五月丁香亭亭操逼| 大战熟女丰满人妻AV| 婷婷五月天亚洲图片| 五月成人天| 婷婷五月a| 亚洲乱码w在线观看| 激情黄色小说色五月| 久久99热这里只有精品| 五月丁香激情在线| 色啪久| 成人网丁香五月| 五他月天啪啪啪| 亚洲愉拍99热成人精品| 婷婷六月中文字幕| 97在线/亚洲| 亚洲五月婷婷| 五月丁香婷婷AV| 狠狠色丁香久久久婷| 久久综合久色欧美综合狠狠| 99久久精品国产色欲| 97亚洲色 torrent magnet| 国产午夜伦鲁鲁| 五月婷婷亚洲| 五月社区婷婷激情| 婷婷六月啪啪| 五月深情久久| 亚洲12p| 欧美精品18| 性爱动图国产麻豆一区二区三区 | 狠狠五月激情丁香六月| 欧美黑人大吊| 婷婷五月综合色中文字幕| 婷婷五月天久久| 婷婷综合五月天亚洲综合| 久久资源网五月婷| 亚洲人人操| 精品夜夜澡人妻无码AV| 色色婷婷五月天| 丁香五月天啪啪激情综和网 | 69人人操人人爽| 五月天婷婷久久| 六月久久狠狠| 五月色丁香国产在线视频| 日韩狠狠色| 五月婷婷开心丁香| 一區四區歐美日韓| 天天操天天爱天天日| www:99热视频| 婷婷中文字幕欧美| 国产精品A成V人在线播放| 五月丁香六月香香蕉| 丁香激情婷婷网| 99久久精彩视频。| WWW.99热| 97在线/亚洲| 1024在线视频| www.ywav| www.99riav99| 1024欧美看片| 99碰碰。| 影音先锋男人av资源站| 久久AV无码精品人妻系列试探| 五月丁香综合激情| 五月天综合久久| 五月婷婷啪啪| 婷婷日欧美在线观看| 激情综合亚洲色婷婷五月| 99热99成人| 97视频久久| 久热伊人9| 五月色亭丁香| 成人VAV视频在线观看| 爆乳熟妇一区二区三区四区| 操碰色一区就去操| 激情色五月天| 色综啪啪| 操婷婷基地| 久草视频大香蕉99| www综合久久| 玖玖99精品视频| 久久五月婷综合网| 99精品国产在热久久婷婷| 亚洲第二AV| 人妻六月天| 日本色超碰| 91婷婷丁香五月亚洲| 综合久久十三| 久操人| 日韩在线成人电影| 婷婷综合日本| AV操逼网| 大香蕉天堂| 丁香激情网| 9久久精品| 99热r| 久久99热这里只有精品23| 九热在线这里有精品6| 极品人妻VIDEOSSS人妻| 91色久| 91碰碰| 国产黄大片在线观看画质优化| 欧美日韩二区在线| 九九热在线视频观看免费10| www,久久久| www.99热日韩.com| 五月丁香激情六月| 91超级碰在线视频| 精品一区二区三区免费毛片爱| 极品人妻VIDEOSSS人妻 | 精品视频网| 怡红院91a√| 人人操人人操919999| 狠狠搞五月天| 久久久精品人妻录| 天天色播| 五月婷婷婷色| 婷婷五月av| 夜夜操少妇| 六月婷婷色综合| 99热都是精品| 亚洲婷婷丁香五月| 美女五月激情| 类似婷婷激情综合网站| 国外亚洲成AV人片在线观看| 婷婷丁香综合| 日日干综合| 亚洲热视频| 天天爽天天日| 九九热123| 日本操片| 九九久久五月天综合伊人| 五月天色五月| 色婷婷丁香花五月天| 探花搜索结果 - 黄上黄| 色之综合网| 五月天亭亭俺也| 大香蕉婷婷色| 色香欲综合| 国产免费av网站| 婷婷 久综合| 五月成人网站| 日韩成人影片网站| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | caopeng超碰| 狠狠色丁香| 99re6在线视频精品免费| 狠狠色丁香婷婷久久综合| 色久五月| 最近免费中文字幕大全高清大全1| 九9九9无码| 久久机只有这里精品| 亚洲高清在线| 在线视频99| 99综合一区| 成人在线日韩| 九九AV| 十一月婷婷激情四射| 青柠影视免费高清电视剧| 久久婷五月婷| 另类A片| 丁香五月婷婷99| 麻豆五月丁香婷婷| 秋霞AV吧| 免费试看小视频 99| 丁香六月婷婷久久综合| 九月丁香| 色婷婷综合网| 激情四射网| av在线免费网站| 激情婷婷在线| 五月天 另类图片| 91人久| 99热国产这里只有| 久青草影院| 亚洲 综合中文| 成人短视频在线| 色情婷| 亚洲色色色| 婷婷性爱综合| 99这里热| 婷婷午夜激情| www.minyis.com【JT】实力收量可预付QQ2101460746 | 26.uuu丁香五月婷婷| 深爱激情五月网| 92久操视频| 亚洲色模骚货| 五月婷婷婷丁香播| 97婷婷五月激情六月丁香伊人| 激情五月,色播五月| 在线不卡AC| 五月婷婷丁香综合| www,色综合| 色色色热| 91天天操天天干天天射| 99热在线看| 欧美成人无码一区二区三区| 国产精品人成A片一区二区| site:wpjngj.com| 亚洲妇女熟BBW| 2025天天爽天天摸| 色色色色色日韩午夜激情 | 秋霞A V毛片| 99精品在线播放| 国产欧美婷婷| 欧美97超碰| 五月天网站亭亭| 六月婷婷七月丁香| 26uuu日韩| 婷婷五月综合欧美在线播放| 一本到不卡高清DVD| 婷婷伊人五月天| 久久99网址| 99热1| 九洲一级A片| 五月天婷婷色| 久久综合激情婷婷激情| 伊人色综合影院视频| 国产激情综合五月久久| 亚洲五月天婷婷综合| 久久五月情| 丁香五月婷婷色| 开心五月色婷| 99热国内精品| 激情图片亚洲| 91人人爽狠狠狠| 久久人妻情侣| 操逼毛片国语对白| 丁香五月婷婷欧美性爱| 日韩色五月| 日日做A爰片久久毛片A片英语| 欧美成人性爱网| 欧美一级色| 五月天大香焦| 思思热在线视频精品| 五月丁香无码视频| 激情宗合哪里能看| www五月天com| www.婷婷.com| 午夜做爱影院| www.夜夜夜| 99热这里有精品首页10| 亚洲av| 综合色播| 亚洲综合五月天婷婷| 丁香五月天色综合| 亚洲激情综| 久久se 综合网| 91精品久久久久久77777| 激情色情五月天| 国产亚洲99| 五月婷婷婷| 成人做爰黄A片免费看直播室男男| 婷婷五月天成人| 五月天激情日色在线| 狠狠操狠狠爱| 69久热| 这里只有精品久久| 思思热视频在线观看| www.爱操com.| 日本综合久| www.日本91| 久久综合站| 99re6在线视频精品免费| 丁香五月婷婷激情网| 天天玩夜夜操| 激情五月婷婷丁香综合网| 五月天婷婷色紫薇阁| 六月丁香大香蕉| 丁香五月天婷婷91| 久久精品天| 99re资源在线视频导航| 狠狠爱深色婷婷综合| 97在线精品| 久热91| 色碰碰| 日本爆乳片手机在线播放| 五月色综合网欧美网| 91碰| 久操人妻| 婷婷操逼| 色综合色综合婷婷热| 五月天啪啪视频| 碰碰女| 啪啪99| 欧美日韩国产日本精品四虎网网站物 | 六月婷婷五月天| 99精吕视频在线观看了| 五月色天情| 欧美色五月天| 99这里只有精品视频| 99看片| 色综合天天| 五月丁香啪| 操日视频| 婷婷综合网| 色综合色色色| 国产成人精品亚洲线观看| 婷婷五月花| 色日本颜射| 丁香六月婷婷久久综合| 天天爽天天爽| 亚洲日韩成人三级av| 亚洲综合五月天婷婷| 丁香五月婷婷总啪啪| 人人操碰| 99久.| 色婷婷手机在线| 美臀自射自家人妻| 午夜婷婷五月天| 少妇达人正片在线播放_ikun_福利吧| 五月丁香婷婷网在线在线| 激情五月天伊人影院| 偷偷操99| 91超级碰| 97人人操人人拍| 99色五月| 婷婷丁香五月天综合网| 五月婷婷亞洲中文| 天天肏在线观看| 色999五月色| 婷婷大香焦| 99五月婷| 激情综合网,婷婷| 久久性爱视频这里只有精品| 欧美三级欧美一级| 人妻丰满精品一区二区A片| 91精品91久久久久77777| 色www.con| 五月婷六月| 色色五月丁香| 五月激情综合深爱| 六月激情婷婷| 欧美天堂婷婷日韩| 超碰人人干| 五月综合亚洲婷婷| 超碰色色综合| 色五月综合激情网| 久久久97| 情婷婷五月天| 激情综合婷婷| a色婷婷| 热久久99视频| 91婷婷丁香五月| 九九热青草| 婷婷五月激情图片| 开心五月深爱激情| 大香蕉综合在线| 国产在线视频1234| 婷婷丁香一月| 丁香五月成人婷婷| 丁香五月久久| 久9久成人精品视频| 96性爱视频| 婷婷色丁香五月| 99在线看视频| 日本天天综合| 成人短视频在线观看| YW无码| 激情五月天综合图片小说网站| www.五月丁香| 99在线免费视频播放| 安息电影在线观看完整版| 激情综合国产| 99艹精品在线观看| 激情五月婷婷伊人| 五月丁香啪啪| 五月婷婷丁香综合,亚洲天堂| 婷婷 激情 五月| 五月花激情| 五月 成人 婷婷| 婷婷色丁香六月| 日木WWW视频| 狠狠艹狠狠艹| 天天干天天操天天爱| 色五月综合激情| 欧美激情综合| 91久久久久久久久18| 一本色道久久综合狠狠躁小说| 成人做爰A片免费看视频| 成人天天爽| 丁香五月综合| 99色网站| 久久久99久久| 欧美啪啪9| 婷婷五月在线观看| 9色免费网| 性生活视频98791| 五月婷婷爽爽爽| 色综合久久888| 91人人爽狠狠狠| 性生活视频98791| 99色在线观看视频| 五月婷久久久| 九九人人精品| 91综合在线视频| 国产精品爽爽久久久久久| 色五月婷婷青娱乐| 久色大| 综合 蜜月 婷婷| 日本五月天婷婷丁香| 激情婷婷五月社区| 五月天激情小说婷婷基地| 久操婷婷| 开心五月婷婷五月| 色婷婷成人做爰A片免费看网站| 五月天伊人av| 国产69久久久欧美黑人A片| 深爱激情九九五月天 | 亚洲综合网区| 99热综合网| 日韩欧洲亚洲| 99精品综合| 五月六月丁香婷婷在线观看| 亚洲亚洲人成综合网络| 丁香五月激情无码视频| 99热www| 成人在线日韩欧美| wwwss在线观看| 天天日天天插| 婷婷5月九九| 色色丁香色五月| 五月天激情网开心网| 色婷婷情片| 超碰人妻在线| 日日鲁鲁夜夜爽爽| 伊人丁香五月婷婷潮吹| 五月丁香自拍| 538在线| 色综合99色| 六月久久婷婷| 色婷婷在线视频久| 欧亚中文A V| 婷婷丁香成人| 婷婷五月天六月综合| A片试看50分钟做受视频| 婷婷五月天六点丁香五月| 五月婷六月| 极品人妻VIDEOSSS人妻| 综合婷婷都市激情| 色婷婷婷av| 亚洲精级| 丁香五月成人社区| 五月丁香激情六月| 91超碰在线观看| 怎么样可以看免费的一级av| 日日干日日| 97人人干人人操| 伊人五月婷| 99人妻碰碰碰久久久久禁片| 五月丁香婷中文| 丁香激情四射| 婷婷丁香红五月91C| 九九大香蕉黄色影院| 成人色站,在线视频,看片-SS1AV| 婷婷五月天丁香久久| 天天干电影| 天天色综合色| 色吧婷婷| 国产av第一专区| 九九99久久| 丁香六月欧美| 婷婷五月永远18免费久久久| 成人毛片在线免费观看| 免费看欧美成人A片无码| 久久99综合网| 婷婷五月天激情五月天网站| 成人网丁香五月| www.97视频| 天天爽夜爽| 天天影视天天爽天天草| 丁香五月狠狠综合欧美| 丁香五月天黄色片| 色黄啪啪| 成人在线观看国产| 我爱大香蕉| 国精产品一区一区三区有限公司杨 | 五月丁香人妻| 色综合久久久无码中文字幕999| 午夜丁香婷婷| 超碰在线观看9| 五月色无码| 99色色爰| 激情久久久久| 综合一区二区三区| 久久久久97| 人妻丰满精品一区二区A片| 欧美日韩成人在线| 久99久热| 色丁香五月婷婷| 天天夜夜爽| 激情五月视频| 五月丁香婷中文字幕| 五月天婷婷一起草| 99热国产精品| 噜噜干日本| 婷婷激情人妻| 久久婷婷人人| 婷婷六月色情| 久久九精品| 青青草99热久久精品国| 久久激情婷婷| 97久久超视频| 男人的天堂99| 玖玖伊人网| 欧洲色区| 丰满少妇猛烈A片免费看观看| 极品人妻VideOssS人妻| 亚洲天天| 97操操| 97香蕉碰碰人妻国产欧美| 五月天婷婷在线AN| 久久婷婷综合五月天| 婷婷金品综合视频| 亚洲激情另类| 六月色婷婷| 激情四射五月天| 五月丁香婷婷久久| 久久久久er热| 日韩成人精品中文字幕| 五月色综合| 99原创自拍视频在线观看| av高清无码| 99久久国产综合精品五月天喷水\| 黄色国久久| 天堂网操| 偷拍91九色| 91在线看免费 九九九九| 狠狠操之狠狠操| 亚洲综合成人网| 思思热久久阴99| www.91有码.com| 婷婷丁香五月,狠狠综合| 激情婷婷五月基地| 99∨VTV| 国产精品电影| 伊人干综合| 秋霞A V毛片| 狠狠色噜噜狠狠狠狠综合| 五月婷婷综合激情| 五月丁香亭亭A片| 久9免费视频| 丁香婷最新动态| 亚洲狠狠狠色婷婷综合激情久久久| 丁香五月激情性色郤| 天天激情欧美美女| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 婷婷天堂综合| 深爱激情四射| 免费观看的婷婷五月视频在线| 丁香五月综合激情性爱| 色婷婷免费观看| 午夜少妇在线观看视频| 天堂网操| 91狠狠色丁香婷婷综合久久精品| 爱草视频在线| 色色色五月婷| 日本乱子人伦在线视频| 久久国产AV| 99在线精品视频免费| 五月停停丁香| 久久精品4| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 热久69| 久久五月天大美女| 日韩在线婷婷五月天综合| 欧美影院婷婷| 六月婷欧美丁香综合| 五月婷婷六月丁香综合| 五月激情丁香五月| 婷婷播5月| 日韩九区| 婷婷刺激综合| 五月婷婷黄色视频| 婷婷精品在线| 亚洲人成播放网站| 五月婷婷开心亚洲无| 日日操夜夜爽天天天| www.9797国产| 操操综合网婷婷| 激情图片婷婷| www久热com| 天天日天天色| 亚洲成人无码网站| 五月天激情小说婷婷基地| 久热无码| av无码电影| 精品久久久久久久久久久久人妻| 丁香六月婷婷综合欧美| 蜜桃人妻无码AV天堂三区| 久热超碰91| 99成人小视频| 无码少妇高潮喷水A片免费| 久久永久视频| 久久丁香五月天| 激情av| 9久久久久久久久久久| 精品51XX| 亚洲第一成人无码A片| 色色日韩网| 九九色大香蕉| 婷婷五月天首页激情| 激情丁香五月天综合| www.五月天色色.com| 亚洲热久| 色婷婷五月天小说| 教师性爱毛片| 五月丁香狠狠爱婷婷综合| 天天操综合网| 97在线日本| 日韩精品无码99| 中文字幕 中文字幕明步| 婷婷六月激情小说网| 97香蕉碰碰人妻国产欧美| 大香蕉人人网| 99热这里只有精品国产首页| 色色婷婷综合| 涩涩网五月天| 少妇AB又爽又紧无码网站 | 欧美黄色AA片哗啦啦啦| 99视频久久| 精品婷婷| 91婷婷在线| 丁香花五月天激情| 大香蕉五月天婷婷丁香91| 激情五月天婷婷在线网址发给我| www.cao.com久久| 亚洲成人色五月天| 六月色色| site:picc-up.com| 噼里啪啦完整版中文在线观看| 超碰9| 成人在线网址| 色婷婷黄色网络| 五月综合无码| 婷婷五月天改成什么了| 天天天天干| 丁香五月婷婷色综合基地| 五月丁香婷婷啪啪| 性爱AV天堂| 国产午夜精品AV一区二区麻豆| 91操色| 婷婷丁香九色| 激情五月天小说| 婷婷丁香成人五月天| 久久久大香蕉| 五六月婷婷| 99国产精品白浆在线观看免费| 成人AV在线网站| 久操香蕉| 五月天激情久久| 中文字幕精品推荐免费在线观| 色亚洲激情| 一区二区免费看| 97热这里只有精品| 五月丁香久久久日婷婷久久婷婷日| 亚洲熟妇AV乱码在线观看| 五月亭亭激情综合| 碰超亚洲| 激情综合99| 婷婷丁香视频在线观看免费| 中文成人在线| 狠狠狠狠狠狠狠狠| 亚韩在线视频| 99re6在线视频精品免费| 五月天精品综合| 久久丁香五月| 大香蕉久久| 丁香婷婷婷五月| AAA久久久| 99爱这里只有精品免费视频| 日韩欧美四五区| 九九九九九九综合| 久久这里有精品| 日本成人小说婷婷六月| 婷婷狠狠香蕉综合| 久久狼人天堂| 狠狠va| 91视频综合网| 五月综合视频| 狠狠色成人影片| www色婷婷| 丁香五月影| 久久婷婷五月综合色奶水99啪| 五月丁香六月激情综合啪啪| 免费成人网在线观看| 9999久久久久| 天天舔天天插天天干| 操人久久| 97啪在线观看视频| 五月丁香六月激情综合| 婷婷色日本| 国产熟女大叫受不了| 国产精品久久久久久久久久免费| 久久婷婷五月天蜜桃| www.五月婷婷.com| 成年人99热| 7月婷婷六月丁香| 激情久久久久久久久| 色色色色色九九九九九| 婷婷五月天成人| 99九九在线精品热动漫| 色丁香五月| 婷婷激情五月综合在线视频| 欧美影院婷婷| 国内自拍97在线| 亚洲婷婷激情综合激情999精品| 五月丁香拍拍激情综合| 亚洲旡码| 碰人人97| 无码激情AAAAA片-区区| 操一操干一干| 婷婷丁香五月六月激情| 亚洲小视频免费播放| 亚洲av成人电影在线观看| 日日影院 | 午夜丁香婷婷| www.夜夜操| 色噜噜婷婷| 五月天婷婷激情干干| 亚洲综合成人网| 激情爱爱网站| 色婷婷丁香花五月天| 亚洲九九视频| 久久婷婷色色| 色99网站| 色色亚卅| 久久A热| 蜜臀av无码久久久久久久久| BT综合在线视频观看| 五月婷婷狠狠久久| 91se视频| 欧美性色A片免费免费观看的| 99热这里有精力| 91丨九色丨熟女|新版| 99热精品免费| 国产一级婬片毛片| 美女100%露全身无挡网站| 丁香五月花婷婷开心| 婷婷伊人网| 九九色色网| 99re热99| 97操碰碰无码视频| 91成人看片| 六月婷婷七月丁香| 久久久久久久久久久97| 99 福利 导航| 最新日韩久热免费视频看看| 久久五月天丁香花| 69人人操人人爽| 99在线精品免费视频| 26uuu国产| 日欧一片内射VA在线影院| 免费看欧美成人A片无码| 91久久婷婷| 99精品在这里| 思思99热| 亚洲欧洲中文日韩久久AV乱码| 五月天婷婷小说| 年轻的妺妺伦理HD中文| 国产亚洲精品久久久久苍井松| 婷婷97狠狠成人网站| 国精产品一区一区三区免费视频| 亚洲精品V天堂中文字幕| 少妇人妻人伦A片| 日韩二区搞逼插逼毛片| 国产精品人成A片一区二区| 婷婷五月花| 99久久欧美| 99啪视频在线观看| 岛囯综合激情网| 色播五月丁香综合| 玖玖婷婷综合| www,五月天com| 丁香五月在线视频黑人| 色色亚洲视频| 99热首页| 91碰免费视频| 另类精品视频在线观看| 六月婷婷之青青草| 26UUU欧美| 99视频在线| 婷婷五月欧美综合| 丁香五月激情综合婷综| 激情五月黄色小说| 久久99激情丁香婷婷小说网| 色婷婷色99国产综合精品| 亚洲无AV在线中文字幕| 在线成人av播放| 久热99| 色婷婷五月中文字幕在线dvd| 欧美熟女99| 狠狠色噜噜狠| 色五月超碰| 天天爽综合| 色色五月丁香| 99精品综合在线| 99热色无码| 色偷偷五月天| 99热在线观看| 操逼视频一区| 插插五月天| 五月天激情电影| 天天综合网色欲香| 亚洲色五月天在线| 亚洲 视频 导航 一区| 1024亚洲无码| 玖玖在线视频福利| 激情五月天影院| 嫩草AV久久伊人妇女超级A| 影视av久久久噜噜噜噜噜三级| 六月天无码网址| 婷婷久久综合久| 成人片在线免费看| 五月天婷婷爱丁香中文字幕| 五月婷婷色影院| 99九九99九九九视频精品| 色婷婷久久综合久色| 精品99在线| 激情五月天情色| 热99久久这里只有精品| 丁香五月五月婷婷| 色欲久久久久久综合网综合网| 开心色播色五月婷婷| 国产这里只有精品| 久久五月激情综合| 99这里只有精品|v| 极骚大香蕉伊人| 色婷婷丁香六月| 99热超碰在线| 超碰在线观看9| 人妻精品一区二区三区| 五月丁香亭亭激情操逼网| 免费99情趣网视频| 婷婷丁香五月亚洲17cao| 久久精品五月天| 国产激情综合五月久久| 久久丁香婷| 第四色婷婷五月| 亚洲日韩一页精品发布| 丁香婷婷五月天色综合| 99热久| 狠狠操狠狠爱| 9色视频在线| 色婷婷中文在线| 99色五月| 天天综合网~91综合网| 天天骑天天操| 性爱五月婷婷| 亚洲综合色色色| 一本九九色| 99A片| 操操精品| 五月婷婷丁香五月 | 丁香六月在线| 日韩成人综合网| 婷婷午夜| 久久色频| 五月天婷婷成人网| 婷婷色五月偷拍| 久草热久草在线视频| 日韩激情婷婷五月天| 国产看真人毛片爱做A片| 九月婷婷丁香| 99精品丰满| 丁香五月婷婷AV在线| 国产日韩av片|