国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

解決canvas畫圖模糊的問題

or0fun / 2130人閱讀

摘要:畫圖經常發(fā)現(xiàn)他是模糊的。解決這個問題主要從兩個方面下手。改變渲染的像素情況畫像素的線條看起來模糊不清,好像更寬的樣子。當我們畫線條時遵循像素的起止范圍,我們能得到標準的細線。但遺憾的是的畫法不一樣。

canvas 畫圖經常發(fā)現(xiàn)他是模糊的。解決這個問題主要從兩個方面下手。

改變canvas渲染的像素
情況:畫1像素的線條看起來模糊不清,好像更寬的樣子。


解決方案

var ctx = canvas.getContext("2d");
ctx.translate(0.5, 0.5);

原理:大家都知道屏幕最小單位就是像素。假如把canvas放的足夠大,我能看到下面樣子。

每一個方格就是長和寬都為1px。當我們畫1px線條時遵循像素的起止范圍,我們能得到標準的細線。


但遺憾的是canvas的畫法不一樣。canvas的每條線都有一條無限細的“中線”,線條的寬度是從中線向兩側延伸的。如果我們還是從第2個像素點畫一條線,那么線條的中線就會靠齊到第2個像素的起點,然后我們開始畫了,問題也就來了:Canvas 的線條以中線向兩側延伸,而不是向某一邊延伸(比如這里,如果只是往右側延伸,那么我們的問題就不再是問題了),延伸過后我們的線條實際上是這樣的:


但是計算機不允許出現(xiàn)<1px的圖形。所以會做個折中,把兩個像素都繪制了。如此一來,本來1px的線條,就成了看起來2px寬的線條。
如何解決這個問題,就是把線條中線和和像素中間點對齊就行了。


中間點位置很好找,向后移動0.5px。所以你們畫線時可以這樣:

ctx.moveTo(100.5,100.5);
ctx.lineTo(200.5,100.5);
ctx.lineTo(200.5,200.5);
ctx.lineTo(100.5,200.5);
ctx.lineTo(100.5,100.5);

或者

ctx.translate(0.5, 0.5);

2.設置顯示比例
在瀏覽器的window變量中有一個devicePixelRatio的屬性,該屬性決定了瀏覽器會用幾個(通常是2個)像素點來渲染1個像素,舉例來說,假設某個屏幕的devicePixelRatio的值為2,一張100x100像素大小的圖片,在此屏幕下,會用2個像素點的寬度去渲染圖片的1個像素點,因此該圖片在此屏幕上實際會占據(jù)200x200像素的空間,相當于圖片被放大了一倍,因此圖片會變得模糊。
**其實方案很簡單,也很容易明白。我們可以創(chuàng)建一個兩倍于實際大小的canvas,然后用css樣式把canvas限定在實際的大小。
下面是實現(xiàn)具體代碼例子:

var canvas = document.getElementById("canvas")
        context= canvas.getContext("2d");  
    var devicePixelRatio = window.devicePixelRatio || 1;
    var backingStoreRatio = context.webkitBackingStorePixelRatio ||
                        context.mozBackingStorePixelRatio ||
                        context.msBackingStorePixelRatio ||
                        context.oBackingStorePixelRatio ||
                        context.backingStorePixelRatio || 1;
    var ratio = devicePixelRatio / backingStoreRatio;
    canvas.width = canvas.width * ratio;
    canvas.width = canvas.height* ratio;
    context.scale(ratio, ratio);
    ctx.translate(0.5, 0.5);
    ctx.lineWidth = 1;
    ctx.moveTo(2.5, 2);
    ctx.lineTo(98.5, 2);
    ctx.lineTo(98.5, 98);
    ctx.lineTo(2.5, 98);
    ctx.lineTo(2.5, 2);
    ctx.stroke();

原來具體詳細解釋:請看這里

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87709.html

相關文章

  • 常見canvas優(yōu)化——模糊問題、旋轉效果

    摘要:常見優(yōu)化方案模糊問題旋轉效果離屏自定義圖片尺寸實踐離屏旋轉效果實踐旋轉的雪花更新關于模糊問題前幾天研究的時候剛好趕上作者發(fā)布新版本,發(fā)現(xiàn)新版本截屏出來的效果比我對舊版本處理后畫布尺寸都設為倍的效果更好。 canvas常見優(yōu)化方案——模糊問題、旋轉效果、離屏、自定義圖片尺寸 實踐demo——canvas離屏、旋轉效果實踐——旋轉的雪花 2017-12-18 16:27:35更新關于模糊問...

    jindong 評論0 收藏0
  • 小程序echarts+canvasdrawer實現(xiàn)頁面轉化圖片并保存到相冊

    摘要:小程序實現(xiàn)頁面轉化圖片并保存到相冊場景小程序測試活動,實現(xiàn)雷達圖展示不同的結果微信頭像二維碼測試結果文字,最終繪制出一張圖片用戶保存相冊。圓形頭像建議切鏤空圖覆蓋,,有很難實現(xiàn)效果建議查看微信小程序社區(qū)的帖子。 小程序echarts+canvasdrawer實現(xiàn)頁面轉化圖片并保存到相冊 場景:小程序測試活動,實現(xiàn)echarts雷達圖展示不同的結果、微信頭像、二維碼、測試結果文字,最終繪...

    Doyle 評論0 收藏0

發(fā)表評論

0條評論

or0fun

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<