2012-11-29 20 views
10

Aktualnie używam kanwy HTML5 do renderowania wielu ciągów znaków za pomocą metody fillText. Działa to dobrze, ale chciałbym również nadać każdemu ciągowi zewnętrzny zewnętrzny obrys o wielkości 1 piksela. Niestety funkcja strokeText wydaje się stosować obrys wewnętrzny. Aby temu przeciwdziałać, napisałem funkcję drawStrokedText, która pozwala osiągnąć pożądany efekt. Niestety jest okropnie wolno (z oczywistych powodów).Rysowanie tekstu za pomocą zewnętrznego obrysu przy użyciu obrazu HTML5

Czy istnieje szybki, oparty na przeglądarce tryb uzyskiwania zewnętrznego obrysu o 1 pikselu z wykorzystaniem rodzimej funkcjonalności płótna?

drawStrokedText = function(context, text, x, y) 
{ 
    context.fillStyle = "rgb(0,0,0)"; 
    context.fillText(text, x-1, y-1); 
    context.fillText(text, x+1, y-1); 
    context.fillText(text, x-1, y); 
    context.fillText(text, x+1, y); 
    context.fillText(text, x-1, y+1); 
    context.fillText(text, x+1, y+1); 

    context.fillStyle = "rgb(255,255,255)"; 
    context.fillText(text, x, y); 
}; 

Oto przykład efektu pracy:

enter image description here

+0

Jak o renderowania tekstu z 'strokeText', ale z nieco większą czcionką w celu uwzględnienia wewnętrznej udaru mózgu? Również w tej metodzie 'drawStrokedText' można pominąć przesunięcia w poziomie/pionie. (Wygląda na to, że już brakuje ci pionu, w jakikolwiek sposób) – Cerbrus

Odpowiedz

32

Co się stało z udarem? Ponieważ połowa obrysu będzie poza formą, zawsze możesz najpierw narysować obrys z szerokością linii podwójnej, którą chcesz. Więc jeśli chciałeś 4PX zewnętrzny obrys można zrobić:

function drawStroked(text, x, y) { 
    ctx.font = "80px Sans-serif" 
    ctx.strokeStyle = 'black'; 
    ctx.lineWidth = 8; 
    ctx.strokeText(text, x, y); 
    ctx.fillStyle = 'white'; 
    ctx.fillText(text, x, y); 
} 


drawStroked("37°", 50, 150); 

sprawia, który:

enter image description here

żywo skrzypce tutaj: http://jsfiddle.net/vNWn6/


jeśli tak się stanie, aby nie wyglądać jak dokładne przy mniejszych skalach renderowania tekstu, zawsze możesz go narysować, ale zmniejszyć (w powyższym przypadku zrobiłbyś ctx.scale(0.25, 0.25))

+1

Dodałem trochę dodatkowego kodu z linkami poniżej, żeby trochę to polerować. Mimo to daj Simonowi to sprytne rozwiązanie! – Jackalope

+0

Dziękuję za dobrą odpowiedź! – Aircraft5

1

Na gładkiej cieniu można spróbować to

ctx.beginPath(); 
ctx.fillStyle = 'white'; 
ctx.font = "bold 9pt Tahoma"; 
ctx.shadowBlur = 3; 
ctx.textAlign = "center"; 
ctx.shadowColor = "#000000"; 
ctx.shadowOffs = 0;     
ctx.fillText('www.ifnotpics.com', 100, 50);   
ctx.closePath(); 
Powiązane problemy