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?
- Convertir RGB a HSV en Android
- Uso de Android-UIL, ¿Cómo detener la descarga?
- OpenCV: detección de puntos / discos circulares de dominó
- Clases de herencia
- Android PhoneGap Plugin, UI tabbar, redimensionar WebView
- Descodificación de paquetes Airplay en Java o C / C ++ en Android
- La comprensión incorrecta del búfer en RxJava
- Uso de android.jar en el proyecto Java - RuntimeException Stub?
- Gradle Sync Falló - Android Studio 2.3.1
- Excepción java.lang.NoClassDefFoundError: com.google.android.gms.common.AccountPicker
- No se puede obtener la respuesta de OkHttp.body.toString () para devolver una cadena
- ¿Cuándo usar un hilo o servicio en Android?
- ¿Cuál es el nombre de mi paquete de aplicación en android?
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:
- SEG_QUADTO : curva paramétrica cuadrática;
- SEG_CUBICTO : curva cúbica paramétrica;
- SEG_LINETO : especifica el punto final de una línea;
- 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):
Los puntos en la forma:
Sólo los puntos:
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.
- Cancelar todas las alarmas configuradas con el administrador de alarmas
- Adición de un recurso de imagen sobre archivo de vídeo desde la tarjeta sd mediante ffmpeg o MediaMuxer para android