亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

詳解FireFox下Canvas使用圖像合成繪制SVG的Bug

2024-08-26 00:21:33
字體:
來源:轉載
供稿:網友

本文適合適合對canvas繪制、圖形學、前端可視化感興趣的讀者閱讀。

楔子

所有的事情都會有一個起因。

最近產品上需要做一個這樣的功能:給一些圖形進行染色處理。想想這還不是順手拈來的事情,早就研究過圖形染色的技術。于是我把之前寫好的兩種算法發給了小伙伴,讓他參照實現,第一種算法是操縱像素、第二種使用了圖像合成:globalCompositeOperation。

所有的事情都可能會有意外,寫程序更是如此了。

沒多久,小伙伴說,第二種算法在firefox下不起作用。

探索原因

聽說有bug,心中一驚。我測試過了的,FireFox下面也測試過的。于是我打開火狐瀏覽器,啟動示例,發現是好的,沒有問題。

但是小伙伴集成到產品中就有問題。 差別在哪兒呢? 通過一起排查,最終發現我的示例代碼和產品中代碼的一個區別是:示例代碼用的是png圖片,而產品中用的是svg圖片。

難道是svg圖片的問題,拿一個svg圖片放到示例代碼中,果然不對。結論已經明顯:

FireFox瀏覽器下,用Canvas下繪制繪制SVG圖的時候,globalCompositeOperation的設置將不生效。

下面是一段用于測試的代碼,ctx.globalCompositeOperation = 'destination-out' 表示用源圖像的形狀去挖空目標圖像。

在其他瀏覽器中,以下代碼中是生效的,又挖空的效果。但是在

在FireFox 下不生效:

<html><head>    <script>        function init() {            var canvas = document.getElementById('c');            var ctx = canvas.getContext('2d');            var img = new Image();            img.onload = function () {                ctx.drawImage(img, 0, 0, img.width * 2, img.height * 2);                ctx.globalCompositeOperation = 'destination-out';            }            img.src = 'diffuse.png';            var svg = new Image;            svg.src = "./d.svg";                                function drawPoint(pointX, pointY) {                ctx.drawImage(svg, pointX - svg.width / 4, pointY - svg.height / 4, svg.width / 2, svg.height / 2);            }            canvas.addEventListener('click', function (e) {                drawPoint(e.clientX, e.clientY);            }, false);        }    </script></head><body onload="init();" style="background: red">    <div>        <canvas id="c" width="1000" height="1000"></canvas>    </div></body></html>

如何解決

找到問題的原因了,解決方法其實簡單。

事情往往就是這樣,很多時候,找到問題所在往往比解決問題要難。

解決方案其實很簡單

代碼中加入判斷,判斷瀏瀏覽器是否是FireFox。

如果是,則先把svg圖片繪制到臨時的canvas上面。

后續繪制用臨時的canvas替代svg圖片。

比如上面代碼可以改進如下:

function init() {            var canvas = document.getElementById('c');            var ctx = canvas.getContext('2d');            var img = new Image();            img.onload = function () {                ctx.drawImage(img, 0, 0, img.width * 2, img.height * 2);                ctx.globalCompositeOperation = 'destination-out';            }            img.src = 'diffuse.png';            var svg = new Image;            svg.src = "./d.svg";                              var tempCanvas = svg;                           if(isFirefox){                             svg.onload = function(){                                  tempCanvas = document.createElement('canvas');                                tempCanvas.width = svg.width;                                tempCanvas.height = svg.height;                                var tempCtx = tempCanvas.getContext('2d');                                tempCtx.drawImage(svg,0,0,svg.width,svg.height);                             }                                    }                                  function drawPoint(pointX, pointY) {                                            ctx.drawImage(tempCanvas, pointX - svg.width / 4, pointY - svg.height / 4, svg.width / 2, svg.height / 2);            }            canvas.addEventListener('click', function (e) {                drawPoint(e.clientX, e.clientY);            }, false);        }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲社区在线观看| 欧美激情在线视频二区| 久久久噜噜噜久久久| 91久久精品美女| 黑人巨大精品欧美一区二区三区| 欧美最猛性xxxxx亚洲精品| 亚洲va久久久噜噜噜久久天堂| 欧美日韩激情视频| 福利二区91精品bt7086| 欧美激情第一页xxx| 国产精品视频1区| 国产日本欧美在线观看| 亚洲自拍偷拍在线| 欧美在线亚洲在线| 日韩亚洲第一页| 欧美亚洲在线视频| 91产国在线观看动作片喷水| 亚洲美女av网站| 欧美亚洲第一区| 欧美电影第一页| 欧美老女人在线视频| 欧美第一黄色网| 亚洲精品mp4| 亚洲美女视频网站| 国产精品夫妻激情| 91精品视频免费| 亚洲国产一区二区三区在线观看| 亚洲xxxx视频| 精品视频—区二区三区免费| 日韩电视剧免费观看网站| 国产亚洲人成网站在线观看| 国产在线观看不卡| 亚洲国产欧美一区二区三区同亚洲| 97色在线观看| 一夜七次郎国产精品亚洲| 国产丝袜精品第一页| 国产精品天天狠天天看| 另类天堂视频在线观看| 96精品久久久久中文字幕| 久久99热精品| 国产精品综合不卡av| 亚洲色图色老头| 亚洲精品影视在线观看| 亚洲天堂成人在线视频| 欧美成人中文字幕在线| 中文字幕亚洲国产| 97国产真实伦对白精彩视频8| 亚洲激情第一页| 欧美激情一区二区三级高清视频| 91最新国产视频| 国产精品人成电影在线观看| 国产日韩亚洲欧美| 国产91精品久久久久| 九九视频直播综合网| 日韩av在线网页| 国产视频精品在线| 国产高清在线不卡| 在线看日韩av| 国产精品嫩草影院久久久| 日韩大片免费观看视频播放| 免费成人高清视频| 精品爽片免费看久久| 亚洲国产高清福利视频| 日韩动漫免费观看电视剧高清| 55夜色66夜色国产精品视频| 日韩三级影视基地| 国产精品网站大全| 欧美日韩xxx| 久久精品亚洲国产| 国产精品视频专区| 久久久亚洲影院| 久久亚洲影音av资源网| 欧美大肥婆大肥bbbbb| 亚洲精品一区在线观看香蕉| 欧美裸体xxxxx| 91夜夜未满十八勿入爽爽影院| 午夜精品久久久99热福利| 日韩欧美亚洲范冰冰与中字| 中文字幕在线国产精品| 亚洲网在线观看| 69av在线视频| 国产精品久久91| 欧美综合在线第二页| 91精品啪aⅴ在线观看国产| 成人福利视频网| 亚洲日本成人女熟在线观看| 国产精品国产福利国产秒拍| 亚洲精品中文字幕有码专区| 亚洲三级av在线| 国产成+人+综合+亚洲欧洲| 精品久久香蕉国产线看观看gif| 奇门遁甲1982国语版免费观看高清| 欧美日韩亚洲天堂| 午夜精品免费视频| 欧美极品在线播放| 国产视频精品一区二区三区| 91九色精品视频| 日本精品一区二区三区在线播放视频| 欧美成人全部免费| 欧美日韩国产一区二区三区| 国产精品久久久久久久久久久久| 精品国产乱码久久久久久婷婷| 欧美超级免费视 在线| 亚洲18私人小影院| 欧美一级黑人aaaaaaa做受| 美女久久久久久久| 亚洲一级免费视频| 青草青草久热精品视频在线观看| 亚洲精品日韩av| 国产精品入口日韩视频大尺度| 亚洲女人被黑人巨大进入| 久久99热精品这里久久精品| 国产精品中文字幕在线观看| 麻豆国产va免费精品高清在线| 一区二区三区精品99久久| 久久五月情影视| 欧美电影在线观看| 欧美在线影院在线视频| 91精品啪aⅴ在线观看国产| 日韩av理论片| 九九精品在线播放| 国产精品va在线播放| 日韩在线视频网站| 国产日韩精品电影| 欧美猛交免费看| 91在线观看免费| 久久婷婷国产麻豆91天堂| 庆余年2免费日韩剧观看大牛| 久热国产精品视频| 亚洲国产精久久久久久久| 疯狂做受xxxx高潮欧美日本| 亚洲国产欧美精品| 久久久久久久成人| 日韩精品在线观看一区| 国内自拍欧美激情| 精品偷拍一区二区三区在线看| 日本久久精品视频| 久久综合九色九九| 欧美日韩国内自拍| 欧美影院在线播放| 国外成人在线播放| 韩国19禁主播vip福利视频| 日韩一区二区三区在线播放| 久久香蕉国产线看观看av| 韩国三级电影久久久久久| 久久精品国产91精品亚洲| 中文字幕日韩电影| 亚洲精品日韩av| 91精品视频观看| 55夜色66夜色国产精品视频| 九九精品在线观看| 亚洲第一网中文字幕| 久久久久五月天| 亚洲欧美三级在线| 国产欧美精品va在线观看| 亚洲最大av网站| 欧美大片免费观看在线观看网站推荐| 久久久精品欧美| 青青精品视频播放| 国产精品久久久久av| 日韩一区二区三区xxxx| 欧美小视频在线观看| 午夜精品一区二区三区在线视| 97视频免费观看|