2013-09-19 3 views
11

Можно ли написать изображение на холсте и написать текст с фоном? Например, как это:Текст на холсте: фон

http://awesomescreenshot.com/09f1qf2213

+0

Не могли бы вы предоставить более подробную информацию о том, что вы пробовали? – davidsbro

+0

Это то, что вы пытаетесь сделать? http://jsfiddle.net/m1erickson/QDDcU/ – markE

ответ

25

Как текст работает в холст

К сожалению, нет, вы не можете производить текст с фоном с текстом методов - только заполнить или обрисовать сам текст.

Это потому, что глифы от шрифта (шрифта) преобразуются в отдельные фигуры или пути, если вы хотите, где фон его будет внутренней частью самого глифа (той части, которую вы видите при использовании заливки). Для черного ящика нет слоя (прямоугольника, в котором находится глиф), глиф использует, кроме того, из его геометрического положения, поэтому нам нужно предоставить своеобразный черный ящик и подшипники.

На старых компьютерных системах большинство шрифтов, где двоичный шрифт, который устанавливает или очищает пиксели. Вместо того, чтобы просто очищать фон, вы можете выбрать фон вместо фона. Это не относится к векторным шрифтам по умолчанию (браузер имеет прямой доступ к геометрии глифов и, следовательно, может обеспечить такой фон).

Создание пользовательского фона

Для того, чтобы создать фон вам нужно будет сделать это первым, используя другие средства, такие как форма или изображения.

Примеры:

ctx.fillRect(x, y, width, height); 

или

ctx.drawImage(image, x, y [, width, height]); 

затем нарисовать текст вверху:

ctx.fillText('My text', x, y); 

Вы можете использовать measureText, чтобы узнать ширину текста (в будущее также высота: восхождение + спуск) и использовать это в качестве основы:

var width = ctx.measureText('My text').width; /// width in pixels 

Вы можете обернуть все это функцией. Функция здесь является основным, но вы можете расширить его с цветом и параметрами фона, а также дополнения и т.д.

/// expand with color, background etc. 
function drawTextBG(ctx, txt, font, x, y) { 

    /// lets save current state as we make a lot of changes   
    ctx.save(); 

    /// set font 
    ctx.font = font; 

    /// draw text from top - makes life easier at the moment 
    ctx.textBaseline = 'top'; 

    /// color for background 
    ctx.fillStyle = '#f50'; 

    /// get width of text 
    var width = ctx.measureText(txt).width; 

    /// draw background rect assuming height of font 
    ctx.fillRect(x, y, width, parseInt(font, 10)); 

    /// text color 
    ctx.fillStyle = '#000'; 

    /// draw text on top 
    ctx.fillText(txt, x, y); 

    /// restore original state 
    ctx.restore(); 
} 

ONLINE DEMO HERE

Просто обратите внимание, что этот способ «измерения» высота не является точным. Вы можете измерить высоту шрифта с помощью временного элемента div/span и получить от него рассчитанный стиль, если для него установлен шрифт и текст.

+0

+1 - Я заметил тангенциальную проблему, о которой мне было любопытно. Текст не может быть выделен. Так же, как это невозможно выделить на изображении. Есть ли способ сделать части текста на холсте, не используя элемент html в качестве слоя? –

+0

@TravisJ грустно не по умолчанию. Текст просто становится пассивным пикселем после того, как текст нарисован так же, как любая другая форма или изображение, поэтому нет никакой разницы с холстом. Вам нужно будет реализовать всю логику для обработки текста как объекта (местоположение, размер, диапазон выбора, выделение, перерисовка и т. Д.).IMHO нет ничего плохого в использовании элемента ввода сверху, если это необходимо, но даже для этого потребуется, чтобы какая-то пользовательская логика хорошо работала с холстом. – K3N

+1

Используйте fabric.js, все связанные с этим холсты находятся здесь http://fabricjs.com/ @rask –

Смежные вопросы