Obtener esquemas de fuentes mediante programación

¿Es de alguna manera posible recuperar el esquema de la fuente (ttf / otf) como una curva / serie de puntos en Android? Por ejemplo, si quería convertir una palabra con una fuente específica en un formato vectorial?

Puesto que nunca desarrollé para un dispositivo androide, le daré la manera de hacer eso, pero en Java .

Este es un par de buenas bibliotecas, pero no sé si sería posible para que lo utilice ( C/C++ ) Así que voy a explicar cómo hacerlo usted mismo.

En primer lugar, debe convertir su palabra en una forma utilizando un TextLayout (una representación gráfica inmutable de los datos de carácter de estilo que puede dibujar) en un FontRenderContext .

De acuerdo con la respuesta de John J Smith aquí: https://stackoverflow.com/a/6864113/837765 , debería ser posible utilizar algo similar a un TextLayout en Android. Pero, no hay ningún quivalente de FontRenderContext . Como he dicho, nunca desarrollado para un dispositivo Android, pero probablemente hay (espero que así) una solución para convertir caracteres en una forma.

En Java algo como esto debería funcionar (para convertir texto en una forma):

 public Shape getShape(String text, Font font, Point from) { FontRenderContext context = new FontRenderContext(null, false, false); GeneralPath shape = new GeneralPath(); TextLayout layout = new TextLayout(text, font, context); Shape outline = layout.getOutline(null); shape.append(outline, true); return shape; } 

A continuación, debe encontrar el límite de forma. No es muy difícil aquí, porque su forma puede darle directamente el iterador de ruta con shape.getPathIterator(null)

En cada iteración, puede obtener el segmento actual, su tipo y las coordenadas:

  1. SEG_QUADTO : curva paramétrica cuadrática;
  2. SEG_CUBICTO : curva cúbica paramétrica;
  3. SEG_LINETO : especifica el punto final de una línea;
  4. SEG_MOVETO : un punto que especifica la ubicación inicial de un nuevo sub-camino.

En este punto, usted debe leer acerca de Bézier curva aquí y aquí .

Usted aprenderá que:

Cualquier spline cuadrática puede expresarse como un cúbico (donde el término cúbico es cero). Los puntos finales del cúbico serán los mismos que los cuadráticos.

CP0 = QP0 CP3 = QP2

Los dos puntos de control para el cúbico son:

CP1 = QP0 + 2/3 * (QP1-QP0) CP2 = CP1 + 1/3 * (QP2-QP0)

Así que la conversión de TrueType a PostScript es trivial.

En Java Algo como esto debería funcionar:

 public List<Point> getPoints(Shape shape) { List<Point> out = new ArrayList<Point>(); PathIterator iterator = shape.getPathIterator(null); double[] coordinates = new double[6]; double x = 0, y = 0; while (!iterator.isDone()) { double x1 = coordinates[0]; double y1 = coordinates[1]; double x2 = coordinates[2]; double y2 = coordinates[3]; double x3 = coordinates[4]; double y3 = coordinates[5]; switch (iterator.currentSegment(coordinates)) { case PathIterator.SEG_QUADTO: x3 = x2; y3 = y2; x2 = x1 + 1 / 3f * (x2 - x1); y2 = y1 + 1 / 3f * (y2 - y1); x1 = x + 2 / 3f * (x1 - x); y1 = y + 2 / 3f * (y1 - y); out.add(new Point(x3, y3)); x = x3; y = y3; break; case PathIterator.SEG_CUBICTO: out.add(new Point(x3, y3)); x = x3; y = y3; break; case PathIterator.SEG_LINETO: out.add(new Point(x1, y1)); x = x1; y = y1; break; case PathIterator.SEG_MOVETO: out.add(new Point(x1, y1)); x = x1; y = y1; break; } iterator.next(); } return out; } 

Creé un proyecto de demostración en Bitbucket, tal vez podría ayudarte. https://bitbucket.org/pieralexandre/fontshape

Texto de la forma inicial (después de la transformación del esquema):

Introduzca aquí la descripción de la imagen

Los puntos en la forma:

Introduzca aquí la descripción de la imagen

Sólo los puntos:

Introduzca aquí la descripción de la imagen

Y la salida de todos los puntos:

 (0.0,0.0) (9.326171875,200.0) (9.326171875,127.734375) (0.0,0.0) (50.7080078125,130.126953125) (62.158203125,138.232421875) (69.82421875,162.158203125) (60.302734375,190.087890625) (50.78125,200.0) //... 

Sé que no puedes usar Graphics2D (lo usé para la interfaz de usuario) en Android, pero deberías poder usar mi solución para un proyecto Android (espero).

Después de eso, usted podría (con la ayuda de la curva de Bézier) para recrear sus curvas.

Además, hay un par de otras buenas herramientas aquí. Echa un vistazo a este:

http://nodebox.github.io/opentype.js/

Está en Javascript, pero tal vez podría ayudarte aún más.

  • Android: ListView vertical con filas superpuestas
  • ¿Cómo parse la fecha en Java? cierta confusión en los formatos de fecha
  • El cajón de navegación no funciona cuando startActivity se utiliza en el primer caso de selectItem
  • Android checkbox.isChecked () no funciona correctamente
  • ¿Descriptor de archivos, ejemplo de filtración?
  • Cómo combinar a dos mapa de bits uno sobre otro
  • Cómo leer una tarjeta inteligente / tarjeta de microprocesador utilizando un lector de tarjetas inteligentes en android mediante programación
  • Actualizar TextView utilizando Timer y ArrayList
  • Problemas para mantener vivo el mensaje de Google Cloud
  • Proyecto LibGDX escrito en Scala, en Android, con IntelliJ
  • Error: Error de ejecución de la tarea ': app: dexDebug'. Com.android.ide.common.process.ProcessException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.