2013-08-31 15 views
8

Aşağıdaki kodda antialias etkisini nasıl devre dışı bırakabilirim? Ben maalesef bir tuval üzerinde çizim yaparken düzgünleştirme devre dışı bırakmak için hiçbir taşınabilir yolu yokturHTML5 kanvas antidiyaları devre dışı bırakabilir ilkel (eğriler, ...)

var canvas = document.getElementById('test'); 
var context = canvas.getContext('2d'); 

// These lines don't change anything 
context.mozImageSmoothingEnabled = false; 
context.webkitImageSmoothingEnabled = false; 
context.imageSmoothingEnabled = false; 

context.beginPath(); 
context.arc(100, 100, 100, 0, Math.PI * 2, true); 
context.closePath(); 

context.fillStyle = 'red'; 
context.fill(); 
+0

Bu soru bana şunu sormamı sağladı: http://stackoverflow.com/questions/14424648/nice-ellipse-on-a-canvas/14429346#14429346 Birkaç kelimeyle: oldukça büyük performans isabeti, antialiasing olmadan ilkelleri çekebilir veya yeniden uygulayabilirsiniz (biraz çalışma belki), ancak antialiasing olmadan hızlı bir şekilde yapmanın bir yolu yoktur. – GameAlchemist

+0

Bir grafik komut dosyası oluştururken, 20 kez aynı şeyi çizip çizmediğinizi, kenar yumuşatılmış piksellerin takma haline geldiğini buldum. Daha hızlı yol, bir görüntü tamponu üzerinde istenen şekilleri çizmek, verileri okuyarak alfa (% 0 veya% 100) kelepçelemek ve görüntü arabelleğini tuvale çekmek. (Kodu yazmak için zamanım yok) –

+0

Lütfen ayrıca "retro kanvas" projemi buradan görebilirsiniz: https://github.com/epistemex/retro-context-canvas (ücretsiz) – K3N

cevap

5

imageSmoothingEnabled sadece görüntüleridrawImage() (dolayısıyla adı görüntü SmoothingEnabled) kullanarak tuval çizilmiş etkiler. Çizgiler ve şekiller için bunu devre dışı bırakmanın hiçbir yolu yoktur.

6502'nin cevabı ve SO'daki önceki cevaplarda olduğu gibi, bunu başarmak için "düşük seviyeli" yöntemleri uygulamanız gerekir. İşte

çeşitli ilkel için bazı ortak algoritmalara bazı bağlantılar:

Bunu uygulamak için gereken yolu x elde etmektir ve y bu formüllerden koordine eder. Ardından, rect(x, y, 1, 1)'u kullanmanız veya doğrudan görüntü veri arabelleğini değiştirerek bir piksel ayarlamanız gerekir. İkincisi, bu tür şeyler için daha hızlı olma eğilimindedir.

Her iki durumda da, tarayıcının dahili derlenmiş yinelemesine karşı JavaScript kullanarak yinelemeniz gerektiğinden, göreceli olarak büyük bir performans düşüşünüz olacaktır.

+0

Yeniden "redüksiyon", OpenGL'den ne haber? Performans hala cezalandırılıyor mu? – Pacerier

+0

@Pacerier OpenGL ile alakalı değildir. WebGL? WebGL'de gölgelendirici kullanarak bir çözüm uygulayabilirsiniz. – K3N

0

Krom 29.

JSFiddle here kullanıyorum.

Bulduğum tek çözüm, görüntü verilerinin üzerine doğrudan yazı yazan ilkel grafiklerin yeniden oluşturulmasıdır.

İlgili konular