當上下文放大時,canvas context.arc()方法會繪製扭曲的弧線。看起來弧線(很差)用貝塞爾曲線近似。在Firefox中正常工作。在IE中未經測試。在Chrome中,放大時畫布弧線會變形
我前段時間觀察過這個問題,但最近它似乎變得更糟(我不知道什麼時候)。
我在StackOverflow上發現了一些畫布問題,但沒有發現這個問題。如果您知道這是已經報告的問題的表現,請轉發一個鏈接。我已經通過Chrome的幫助/報告發布機制進行了報告。
在我寫我自己的之前,有沒有人有解決方法? ......也許是一種重載或替代的「弧線」方法?
下面的演示是可見這裏:http://keveney.com/chrome_arc_bug.html
paint_canvas();
// simulate circle with line segments
//
function regular_polygon(ctx, segments, cx, cy, r) {
var i, a;
ctx.moveTo(cx + r, cy);
for (i = 0; i < segments; i++) {
a = (Math.PI * 2) * i/segments;
ctx.lineTo(cx + r * Math.cos(a), cy + r * Math.sin(a));
}
ctx.closePath();
ctx.stroke();
}
function paint_canvas() {
var ctx;
// draw unscaled circle using canvas 'arc' method
//
ctx = document.getElementById('canv').getContext('2d');
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.lineWidth = 1.25;
ctx.arc(250, 250, 200, 0, 2 * Math.PI, false);
ctx.stroke();
// draw enclosing polygons
//
ctx.beginPath();
ctx.strokeStyle = "#c00";
regular_polygon(ctx, 36, 250, 250, 215);
regular_polygon(ctx, 36, 250, 250, 185);
// the same but scaled up from smaller units
//
ctx = document.getElementById('canv2').getContext('2d');
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.scale(100, 100);
ctx.lineWidth = 1.25/100;
ctx.arc(2.5, 2.5, 2, 0, 2 * Math.PI, false);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "#c00";
regular_polygon(ctx, 36, 2.5, 2.5, 2.15);
regular_polygon(ctx, 36, 2.5, 2.5, 1.85);
}
body {
background-color: #F4F4F4;
width: 800px;
margin-left: auto;
margin-right: auto;
}
canvas {
background-color: #FFFFFF;
}
<p>Chrome arc scaling bug</p>
<canvas id="canv" height=500 width=500></canvas>
<canvas id="canv2" height=500 width=500></canvas>
<p>expected: Both images should be identical.</p>
<p>actual: Arc in second image is badly distorted.</p>
<p>Issue reported 6/17/2015.</p>
<p>tested with 43.0.2357.124 (64-bit)</p>
<p>This issue was observed some time ago, but has gotten worse in recent releases of Chrome. Not tested on Internet Explorer. If you find a convenient solution,
please notify Matt Keveney, [email protected]</p>
我不認爲你的原始解釋是準確的;你已經說明了一個已經放大的低分辨率位圖再現......這不是這裏發生的事情。 (請注意,這只是Chrome中的一個錯誤,不是一般性問題)。您的解決方法僅僅反轉了縮放效果,我認爲這是該作業,但並不是我所希望的方法。但是,感謝您花時間! – mkeveney