摘要:之前我在上回答過繪制圖片模糊的問題,但是可能是由于我給出的答案過于簡略,加上答案中的鏈接已經失效,很多人反映這種辦法并不好使。前提條件假設我們要在中繪制一張的圖片,并且要保證它在高清屏中不模糊。
前提條件之前我在 SF 上回答過「html5 canvas繪制圖片模糊的問題」,但是可能是由于我給出的答案過于簡略,加上答案中的 demo 鏈接已經失效,很多人反映這種辦法并不好使。但是我在給出答案之前是在小米2 和 iPhone 上測試過的,沒有任何問題。下面我會一步一步地描述具體的步驟。
假設我們要在 canvas 中繪制一張 300 x 90 的圖片,并且要保證它在高清屏中不模糊。那么我們首先要準備一張 600 x 180 的圖片,處理過高清屏的同學應該會有這方面的經驗。
問題重現OK,我們先把問題重現一下,以便有一個更直觀的了解。下面是相關的代碼(為了簡單起見,我把代碼都寫在了 HTML 文檔里面):
代碼很簡單,沒有做任何處理,具體的效果和完整的代碼可以查看這個 DEMO,這個 demo 在高清屏的手機中會出現的問題:canvas 中的圖片變模糊了!。
至于為什么會變模糊,這和瀏覽器處理 canvas 的方式有關,相關的文章可以參考這篇 High DPI Canvas,這里不作深入介紹。
解決問題 首先,引入 hidpi-canvas-polyfill其實,不只是繪制圖片時會出現模糊的問題,正常情況下,在高清屏的設備中,任何繪制在 canvas 中的圖形(包括文字)都會出現模糊的問題。上面這個 polyfill 就是為了解決這個問題,但是它沒有處理圖片。
接下來,修改繪制圖片的代碼將 init 函數修改成下面這樣:
function init() { var canvas = document.querySelector("canvas"); var ctx = canvas.getContext("2d"); // polyfill 提供了這個方法用來獲取設備的 pixel ratio var getPixelRatio = function(context) { var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; return (window.devicePixelRatio || 1) / backingStore; }; var ratio = getPixelRatio(ctx); // 注意,這里的 width 和 height 變成了 width * ratio 和 height * ratio ctx.drawImage(document.querySelector("img"), 0, 0, 300 * ratio, 90 * ratio); }
可以點擊這里查看完整的代碼和效果,在高清屏的設備中打開,看看 cavans 中的圖片是否完美顯示。
說明這個解決方案本質上和 @白一梓 的答案是一樣的:先放大 canvas,再用 CSS 將其限制回原始大小。
如果你看了 polyfill 的代碼就會明白其中的原理了,這個 polyfill 的代碼十分簡短明了,它做了兩件事:一是將 canvas 的高和寬分別乘以 ratio 將其放大,然后又用 CSS 將高和寬限制成初始的大小;二是 hack canvas 中常用的函數,如:fillRect, clearRect, lineTo, arc 等,將它們的參數都乘以 ratio,以方便我們可以像以前那樣使用這些方法,而不用在傳參的時候手動乘以 ratio。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85960.html
摘要:現在有很多微信公眾號運營活動,都有生成圖片的需求,生成圖片后可以發送給好友和發到朋友圈擴散,利于產品的宣傳生成圖片可以用但是由于已經有了這個開源庫,所以為了節省時間就沒有自己寫了地址少啰嗦,先看東西根據獲取像素比將傳入值轉為整數繪制獲取想要 現在有很多微信公眾號運營活動,都有生成圖片的需求,生成圖片后可以發送給好友和發到朋友圈擴散,利于產品的宣傳! 1. 生成圖片可以用canvas,但...
摘要:現在有很多微信公眾號運營活動,都有生成圖片的需求,生成圖片后可以發送給好友和發到朋友圈擴散,利于產品的宣傳生成圖片可以用但是由于已經有了這個開源庫,所以為了節省時間就沒有自己寫了地址少啰嗦,先看東西根據獲取像素比將傳入值轉為整數繪制獲取想要 現在有很多微信公眾號運營活動,都有生成圖片的需求,生成圖片后可以發送給好友和發到朋友圈擴散,利于產品的宣傳! 1. 生成圖片可以用canvas,但...
摘要:本次技術調研來源于項目中的一個重要功能需求實現微信長按網頁保存為截圖。以下主要解決兩類跨域的圖片資源包括已配置過的中的圖片資源和微信用戶頭像圖片資源。 本次技術調研來源于H5項目中的一個重要功能需求:實現微信長按網頁保存為截圖。 這里有個栗子(請用微信打開,長按圖片即可保存):3分鐘探索你的知識邊界 將整個網頁保存為圖片是一個十分有趣的功能,常見于H5活動頁的結尾頁分享。以下則是項目中...
閱讀 2578·2021-09-30 09:48
閱讀 2568·2019-08-30 14:10
閱讀 2712·2019-08-29 11:22
閱讀 1841·2019-08-26 13:51
閱讀 2279·2019-08-26 12:02
閱讀 2420·2019-08-23 16:06
閱讀 3557·2019-08-23 14:06
閱讀 1096·2019-08-23 13:56