Czy Mogę wyłączyć antyaliasing na elemencie HTML?

I ' m playing around with the <canvas> element, rysowanie linii i tym podobne.

Zauważyłem, że moje ukośne linie są antyaliasowane. Wolę jaggy look dla tego, co robię - czy jest jakiś sposób na wyłączenie tej funkcji?
Author: Ry-, 2008-10-12

8 answers

Dla obrazów jest teraz context.imageSmoothingEnabled= false.

Jednak nie ma nic, co bezpośrednio kontroluje rysowanie linii. Może być konieczne narysowanie własnych linii (w trudny sposób ) za pomocą getImageData i putImageData.

 44
Author: Kornel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-10 23:50:57

Narysuj 1-pixel linie na współrzędnych jak ctx.lineTo(10.5, 10.5). Rysowanie jednopikselowej linii nad punktem (10, 10) oznacza, że ten piksel 1 w tej pozycji sięga od 9.5 do 10.5, co skutkuje dwoma liniami, które są rysowane na płótnie.

Fajną sztuczką, aby nie zawsze trzeba było dodawać 0.5 do rzeczywistej współrzędnej, którą chcesz narysować, jeśli masz dużo jednopikselowych linii, jest ctx.translate(0.5, 0.5) całe płótno na początku.

 56
Author: allan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-19 09:45:16

Można to zrobić w Mozilli Firefox. Dodaj to do swojego kodu:

contextXYZ.mozImageSmoothingEnabled = false;

W Operze jest to obecnie żądanie funkcji, ale mam nadzieję, że wkrótce zostanie dodane.

 24
Author: francholi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-05 18:08:07

Musi być antyaliasowa grafika wektorowa

Antyaliasing jest wymagany do poprawnego kreślenia grafiki wektorowej ze współrzędnymi nie całkowitymi (0.4, 0.4), co zrobi tylko niewielu klientów.

Gdy podano współrzędne nie-całkowite, płótno ma dwie opcje:

  • Antialias - maluje piksele wokół współrzędnych w odniesieniu do odległości współrzędnej całkowitej od nie-całkowitej (błąd zaokrąglania).
  • Runda - zastosuj jakąś funkcję zaokrąglania do współrzędnej Nie-całkowitej(więc 1.4 będzie na przykład 1).

Późniejsza strategia będzie działać dla Grafiki statycznej, chociaż dla małej Grafiki (okrąg o promieniu 2) krzywe będą pokazywać wyraźne kroki, a nie gładką krzywą.

Prawdziwy problem polega na tym, że grafika jest tłumaczona (przesuwana) - przeskakuje między jednym pikselem a drugim (1.6 => 2, 1.4 => 1), oznacza, że pochodzenie kształtu może przeskoczyć w stosunku do kontenera macierzystego (ciągłe przesuwanie 1 piksela w górę / w dół i w lewo/w prawo).

Kilka porad

Wskazówka # 1: możesz zmiękczyć (lub utwardzić) antyaliasing, skalując płótno (powiedzmy przez x), a następnie samodzielnie zastosować wzajemną skalę (1 / x) do geometrii (nie używając płótna).

Porównaj (bez skalowania):

Kilka prostokątów

With (canvas scale: 0.75; manual scale: 1.33):

Te same prostokąty z bardziej miękkimi krawędziami

And (Skala płótna: 1.33; skala ręczna: 0.75):

Te same prostokąty z ciemniejszymi krawędziami

Tip # 2: Jeśli naprawdę szukasz jaggy look, spróbuj narysować każdy kształt kilka razy (bez wymazywania). Z każdym rysunkiem antyaliasingowe piksele stają się ciemniejsze.

Porównaj. Po narysowaniu raz:

Kilka ścieżek

Po trzykrotnym narysowaniu:

Te same ścieżki, ale ciemniejsze i bez widocznego antyaliasingu.

 9
Author: Izhaki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-01 20:35:52

Narysowałbym wszystko używając niestandardowego algorytmu liniowego, takiego jak algorytm liniowy Bresenhama. Sprawdź tę implementację javascript: http://members.chello.at/easyfilter/canvas.html

Myślę, że to na pewno rozwiąże Twoje problemy.

 8
Author: raRaRa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 16:55:48

Chcę dodać, że miałem problemy podczas zmniejszania rozmiaru obrazu i rysowania na płótnie, nadal używało wygładzania, mimo że nie używało podczas skalowania.

Rozwiązałem używając tego:

function setpixelated(context){
    context['imageSmoothingEnabled'] = false;       /* standard */
    context['mozImageSmoothingEnabled'] = false;    /* Firefox */
    context['oImageSmoothingEnabled'] = false;      /* Opera */
    context['webkitImageSmoothingEnabled'] = false; /* Safari */
    context['msImageSmoothingEnabled'] = false;     /* IE */
}

Możesz użyć tej funkcji w następujący sposób:

var canvas = document.getElementById('mycanvas')
setpixelated(canvas.getContext('2d'))
Może to się komuś przyda.
 6
Author: Elric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-26 14:31:47
ctx.translate(0.5, 0.5);
ctx.lineWidth = .5;

Z tego combo mogę narysować ładne cienkie linie 1px.

 5
Author: retepaskab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-30 14:18:47

Zauważ bardzo ograniczoną sztuczkę. Jeśli chcesz utworzyć obraz w 2 kolorach, możesz narysować dowolny kształt z kolorem #010101 na tle z kolorem #000000. Gdy to zrobisz, możesz przetestować każdy piksel w imageData.data [] i ustawić na 0xFF niezależnie od wartości nie jest 0x00:

imageData = context2d.getImageData (0, 0, g.width, g.height);
for (i = 0; i != imageData.data.length; i ++) {
    if (imageData.data[i] != 0x00)
        imageData.data[i] = 0xFF;
}
context2d.putImageData (imageData, 0, 0);

Rezultatem będzie nie antyaliased czarno-biały obraz. Nie będzie to idealne, ponieważ nastąpi jakiś antyaliasing, ale ten antyaliasing będzie bardzo ograniczony, a kolor kształtu będzie bardzo podobnie jak kolor tła.

 4
Author: StashOfCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 19:58:01