Подпиксельный сглаженный текст в элементе холста HTML5 - программирование
Подтвердить что ты не робот

Подпиксельный сглаженный текст в элементе холста HTML5

Я немного смущен тем, как текст элемента canvas сглаживает текст и надеюсь, что вы все сможете помочь.

На следующем скриншоте верхний "Quick Brown Fox" является элементом H1, а нижний - элементом холста с текстом, отображаемым на нем. Внизу вы можете видеть, что оба "F" расположены бок о бок и увеличены. Обратите внимание, что элемент H1 лучше сочетается с фоном:

Вот код, который я использую для рендеринга текста холста:

        var canvas = document.getElementById('canvas');
        if (canvas.getContext){

            var ctx = canvas.getContext('2d');
            ctx.fillStyle = 'black';
            ctx.font = '26px Arial';
            ctx.fillText('Quick Brown Fox', 0, 26);
        }

Можно ли сделать текст на холсте таким образом, чтобы он выглядел идентично элементу H1? И почему они разные?

4b9b3361

Ответ 1

Отвечая на мой собственный вопрос:

Возможно использование метода, продемонстрированного на этом сайте:

https://bel.fi/alankila/lcd/

Единственная проблема заключается в том, что ее слишком медленно реализовать в производственном приложении. Если кто-то бежит быстрее, пожалуйста, дайте мне знать.

Ответ 2

Теперь можно получить субпиксельный рендеринг шрифтов, создав непрозрачный контекст холста. В Safari и Chrome вы можете получить это с помощью этого фрагмента:

var ctx = canvas.getContext("2d", {alpha: false})

Я нашел это из этого сообщения .

Ответ 3

Мэтт, я сидел с (той же/подобной) проблемой на прошлой неделе, что, в моем случае, оказалось из-за различий в плотности пикселей на устройствах, которые я тестировал; Я написал об этом сегодня вечером - http://joubert.posterous.com/crisp-html-5-canvas-text-on-mobile-phones-and

Ссылка на новость мертва, поэтому вот суть с исходным кодом: https://gist.github.com/joubertnel/870190

И сам фрагмент:

  // Output to Canvas without consideration of device pixel ratio
  var naiveContext = $('#naive')[0].getContext('2d');    
  naiveContext.font = '16px Palatino';
  naiveContext.fillText('Rothko is classified as an abstract expressionist.', 10, 20);

  // Output to Canvas, taking into account devices such as iPhone 4 with Retina Display
  var hidefCanvas = $('#hidef')[0];
  var hidefContext = hidefCanvas.getContext('2d');

  if (window.devicePixelRatio) {
    var hidefCanvasWidth = $(hidefCanvas).attr('width');
    var hidefCanvasHeight = $(hidefCanvas).attr('height');
    var hidefCanvasCssWidth = hidefCanvasWidth;
    var hidefCanvasCssHeight = hidefCanvasHeight;

    $(hidefCanvas).attr('width', hidefCanvasWidth * window.devicePixelRatio);
    $(hidefCanvas).attr('height', hidefCanvasHeight * window.devicePixelRatio);
    $(hidefCanvas).css('width', hidefCanvasCssWidth);
    $(hidefCanvas).css('height', hidefCanvasCssHeight);
    hidefContext.scale(window.devicePixelRatio, window.devicePixelRatio);               
  }

  hidefContext.font = "16px Palantino";
  hidefContext.fillText("Rothko is classified as an abstract expressionist.", 10, 20);

Ответ 4

Вот способ выполнения субпиксельной рендеринга для любого содержимого холста (текст, изображения, векторы и т.д.). http://johnvalentine.co.uk/archive.php?art=tft.

Схема метода

Он натягивается на холст, который затем тянется к экрану, чтобы использовать субпиксели RGB-striped. Он также работает с альфа-каналами. Обратите внимание, что это может не сработать, если вы используете портретный дисплей, не полосатые пиксели или если ваш браузер отображает холсты с меньшим разрешением, чем ваш дисплей.

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

Ответ 5

Это обычно называется подпиксельное сглаживание или ClearType в Windows. Я не знаю никаких комбинаций ОС/браузеров, которые в настоящее время поддерживают это для Canvas.

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

Изменить: мое предположение было неправильным; похоже, что Safari, Chrome и Firefox используют некоторые пиксельные шрифты. Safari и Chrome появляются одинаково, привязавшись к границам всего пикселя, но отличаются от Firefox (привязка к границам с половиной пикселей?). Смотрите визуальные результаты тестирования (на OS X) здесь: http://phrogz.net/tmp/canvas_text_subpixel.html