Есть ли способ получить фактическую ограничительную рамку глифа в ActionScript? - PullRequest
2 голосов
/ 22 декабря 2009

Я изучаю ActionScript / Flash. Мне нравится играть с текстом, и я сделал много такого с превосходным API Java2D.

Одна из вещей, которые мне нравится знать, это "где именно вы рисуете этот глиф?" Класс TextField предоставляет методы getBounds и getCharBoundaries, но эти методы возвращают прямоугольники, которые выходят далеко за пределы реальных границ всего текстового объекта или отдельного символа, соответственно.

var b:Sprite = new Sprite();
b.graphics.lineStyle(1,0xFF0000);
var r:Rectangle = text.getCharBoundaries(4);
r.offset(text.x, text.y);
b.graphics.drawRect(r.x,r.y,r.width,r.height);
addChild(b);

b = new Sprite();
b.graphics.lineStyle(1,0x00FF00);
r = text.getBounds(this);
b.graphics.drawRect(r.x,r.y,r.width,r.height);
addChild(b);

some bounds

Есть ли способ получить более точную информацию о реальных визуальных границах текстовых глифов в ActionScript?

Ответы [ 3 ]

3 голосов
/ 22 декабря 2009

Ричард на правильном пути, но BitmapData.getColorBounds () намного быстрее и точнее ... Я использовал его пару раз и оптимизировал для ваших конкретных нужд, он не такой медленный, как можно подумать.

Предложение Кори об использовании flash.text.engine, вероятно, является "правильным" способом, но я предупреждаю вас, что flash.text.engine ОЧЕНЬ (очень!) Трудно использовать по сравнению с TextField.

2 голосов
/ 22 декабря 2009

Невероятно возможно во Flash 9 - ответ Ричарда - умный обходной путь, хотя, вероятно, он совершенно не подходит для производственного кода (как он упоминает):)

Если у вас есть доступ к Flash 10, ознакомьтесь с новыми классами текстового движка , особенно TextLine.

2 голосов
/ 22 декабря 2009

Боюсь, что все методы, доступные в TextField, должны делать то, что вы уже нашли. Если производительность не является ключевой в вашем приложении (т. Е. Если вы не собираетесь делать это очень часто), возможно, одним из вариантов будет рисование текстового поля в BitmapData и поиск самых верхних, самых левых и т. Д. Цветных пикселей в ограничительной рамке, полученной getCharBoundaries ()

var i : int;
var rect : Rectangle;
var top_left : Point;
var btm_right : Point;

var bmp : BitmapData = new BitmapData(tf.width, tf.height, false, 0xffffff);
bmp.draw(tf);

rect = tf.getCharBoundaries(4);
top_left = new Point(Infinity, Infinity);
btm_right = new Point(-Infinity, -Infinity);

for (i=rect.x; i<rect.right; i++) {
  var j : int;

  for (j=rect.y; j<rect.bottom; j++) {
    var px : uint = bmp.getPixel(i, j);

    // Check if pixel is black, i.e. belongs to glyph, and if so, whether it
    // extends the previous bounds
    if (px == 0) {
      top_left.x = Math.min(top_left.x, i);
      top_left.y = Math.min(top_left.y, j);
      btm_right.x = Math.max(btm_right.x, i);
      btm_right.y = Math.max(btm_right.y, j);
    }
  }
}

var actualRect : Rectangle = new Rectangle(top_left.x, top_left.y);
actualRect.width = btm_right.x - top_left.x;
actualRect.height = btm_right.y - top_left.y;

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

Очевидно, что это не оптимальный код, с вложенными циклами и ненужными точечными объектами. Надеюсь, что код достаточно читабелен, и вы сможете разобрать части, которые легче всего оптимизировать.

Возможно, вы захотите ввести некоторое пороговое значение вместо игнорирования любого пикселя, который не является черным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...