Edición de archivos de fuente Ttf

La extracción (conversión) de fuentes vectoriales de Windows requiere la visualización de caracteres chinos en muchas situaciones, como en tableros electrónicos para anuncios de paradas de autobús y centros comerciales que muestran información diversa sobre productos. Windows proporciona una rica biblioteca de fuentes. Cómo utilizar estas fuentes para mostrar caracteres chinos es un problema que debe resolverse. Windows admite fuentes GDI y fuentes de dispositivo. Las fuentes GDI se almacenan en archivos del disco duro, mientras que las fuentes del dispositivo son inherentes al dispositivo de salida. Las fuentes GDI se dividen en tres tipos: fuentes de mapa de bits, fuentes de trazo y fuentes TrueType. Las fuentes de las fuentes de mapa de bits se pueden obtener directamente del archivo de fuentes. Las dos últimas son fuentes vectoriales y sus fuentes no se pueden obtener directamente. Por lo tanto, las fuentes de trazo y las fuentes TrueType deben rasterizarse para obtener la fuente deseada.

Por lo general, los sistemas electrónicos utilizan fuentes de mapa de bits de 16×16 (32 bytes) para mostrar información. Por ejemplo, Chs16.fon en Win98 es un archivo de fuente de 16×16 (32 bytes). El método para extraer fuentes es: el código interno de los caracteres chinos es de dos bytes, que se establecen en A y b respectivamente. El tamaño de A debe estar entre 0xa1 y 0xfe, su código de área es qu=a-0xa0 y. el código de bits es wei = b- 0xa0, la posición de la fuente de caracteres chinos en el archivo de fuente está desplazada = ((qu-1) × 94 (Wei-1)) × 32.

Este artículo presenta principalmente el método de extracción de fuentes de fuentes vectoriales de Windows. Este método se ha utilizado con éxito en el diseño de sistemas de microcomputadoras de un solo chip para resolver el problema de la visualización de caracteres chinos. En aplicaciones prácticas, se puede llamar directamente a la función API de Win32 para convertir el texto de caracteres chinos que debe extraerse en un mapa de bits, realizando así la matriz de puntos de los caracteres chinos y extrayendo fuentes.

1Configuración de fuente

Primero debes configurar la fuente. Win32 SDK proporciona un cuadro de diálogo de selección de fuente general, simplemente llame a la función ChooseFont y su valor de retorno es un valor booleano. La definición específica es boolchoosefont (lpchoosefont lpcf). Después de llamar a esta función, aparece un cuadro de diálogo de selección de fuente, donde puede seleccionar la fuente requerida, la forma de la fuente, el tamaño de la fuente y otros parámetros. Después de la selección, si se hace clic en Aceptar en el cuadro de diálogo de selección de fuente, la función devuelve un valor distinto de cero; si se hace clic en la tecla Cancelar, la función devuelve un valor cero; Antes de llamar a esta función, es necesario definir dos variables:

Elegir fuente cf;

LOGFONT logfont

CHOOSEFONT es una estructura con más de diez campos, que contiene diversa información utilizada por la función ChooseFont para inicializar el cuadro de diálogo de selección de fuente. LOGFONT es también una estructura que contiene 14 campos que definen varios atributos de la fuente. Después de hacer clic en Aceptar, el sistema devuelve la información de la fuente seleccionada a través de la estructura LOGFONT. La información de fuente devuelta se almacena en la estructura LOGFONT especificada por el campo lpLogFont de la estructura CHOOSEFONT.

El siguiente es el código para llamar a la función ChooseFont:

//Inicializar CHOOSEFONT

cf structsize = sizeof(choose font);

cf.hwndOwner = hwnd//El identificador de la ventana actual

cf.hDC = NULL

cf.lpLogFont = amplogfont//La información de fuente devuelta por el sistema se guarda aquí.

cf . ipointsize = 0;

CF Flags = CF _ INITTOLOGFONTSTRUCT | CF _

Fuentes de pantalla | CF _ EFFECTS colores RGB = 0;

cf lcustdata = 0;

cf.lpfnHook = NULL

cf.lpTemplateName = NULL

cf.hInstance = NULL

cf.lpszStyle = NULL

cf nfonttype = 0

cf . p>cf .nsizemax = 0;

Seleccionar fuente (ampcf); //Después de llamar a esta función, aparecerá un cuadro de diálogo general para la selección de fuente.

Si la función SelectFont(;Cf) devuelve un valor distinto de cero, entonces la fuente ha sido seleccionada. La fuente seleccionada se guarda en la variable logfont. Lo siguiente que debe hacer es crear la fuente lógica seleccionada. Puede llamar a la función CreateFontIndirect para crear fuentes lógicas. La función CreateFontIndirect acepta un puntero a la estructura LOGFONT, que se define específicamente como hfont CreateFontIndirect(constlogfont?Lplf). El código es el siguiente:

HFONT hNewFont = CreateFontIndirect(amp; log font);

En este punto, se completa la creación de la fuente. Al llamar directamente a la función SeletObject, la fuente lógica creada se puede seleccionar en la tabla de contexto del dispositivo. En la conversión de mapas de bits, la función SelectObject se utilizará para seleccionar hNewFont en la tabla de contexto del dispositivo de memoria. Pero cabe señalar que antes de que finalice el programa, se debe llamar a la función DeleteObject(hNewFont) para liberar el controlador de fuente y evitar pérdidas de memoria. A continuación se describe el proceso de implementación específico de convertir texto en mapas de bits.

2 Conversión de mapa de bits

Aquí se muestra un ejemplo de cómo extraer la fuente "ting". Primero, debe definir las siguientes variables:

carácter chino WCHAR estático [] = "Ting";

HBITMAP estático hBitmap

static int cxBitmap, cyBitmap

HDC estático hdc, hdcMem

PAINTSTRUCT ps

Tamaño;

CxBitmap y cybermap son el tamaño del mapa de bits que se va a crear. con la función GetTextExtentPoint32 El texto resultante tiene el mismo tamaño, que es el tamaño de la palabra "Ting" aquí.

El siguiente es el método específico para convertir texto de caracteres chinos en un mapa de bits, que generalmente se procesa en el mensaje WM_PAINT.

Caso WM_PAINT:

hdc = start paint(hwnd amp; PS); //Obtiene el identificador del dispositivo de la ventana actual.

hdc mem = CreateCompatileDC(hdc); //Crea una tabla de descripción del dispositivo de memoria.

SelectObject(hdcMem, hNewFont); //Selecciona la fuente creada en la tabla de descripción del dispositivo de memoria.

GetTextExtendPoint32W(hdcMem, Hanzi, 1, amp size);

//Obtiene el tamaño del texto que se mostrará.

cxBitmap = tamaño.cx

cyBitmap = tamaño.cy

hbit map = createcompatiletibbitmap(hdc, cxBitmap,

cyBitmap); //Crea un identificador de mapa de bits

SelectObject(hdcMem, hbit map); //Selecciona un mapa de bits en la tabla de descripción del dispositivo de memoria.

TextOutW(hdcMem, 0, 0, caracteres chinos, 1); //Dibuja caracteres chinos en el mapa de bits de la tabla de descripción del dispositivo de memoria.

BitBlt(hdc, 0, 0, cxBitmap, cyBitmap, hdcMem, 0, 0, SRC-

Copy); ventana y observe el efecto de visualización.

En este punto, se completa el proceso de matriz de puntos de los caracteres chinos y el siguiente paso es extraer la fuente.

3 Extraer fuentes

La función GetPixel se utiliza para extraer fuentes, definidas como COLORREF GetPixel(HDC hdc, int nXPos, int nYPos). Esta función devuelve un valor de tipo COLORREF, que es el valor RGB del punto especificado por nXPos y nYPos. El tamaño del mapa de bits se determinó en el artículo anterior. Dentro de este rango, cada píxel se escanea una vez y se genera un código de mapa de bits basado en el valor RGB devuelto. Debido a que las fuentes vectoriales de Windows tienen escala de grises, debe elegir un valor RGB apropiado para determinar si este punto es válido. El valor RGB del blanco es FFFFFFH, el gris oscuro es 808080H y el negro es 000000H. Puede elegir el gris oscuro como base para juzgar. Este punto se considera válido cuando el valor de retorno de la función es menor que 808080H. La siguiente es la función para extraer fuentes, almacenadas en bytes, escaneando desde el primer punto de la primera línea:

Jingmozi[2048]; //Hay un código de cuadrícula en esta matriz.

void GetZimo(HDC hdc, int nXPos, int nYPos)

{

int Hang, Lie//Hang es el número de filas escaneadas.

int temp, I, j, g

Hang = nYPos

Mentira = nXPos

if(Mentira 8==0 ){

Lie = Lie/8; //El ancho del mapa de bits es un múltiplo entero de 8, por lo que

//Solo se necesitan Lie/8 bytes para almacenar la fuente. .

temp = 0;

}

En caso contrario {

temp = Mentira 8;

Mentira = Mentira /8 1; //El ancho del mapa de bits no es un múltiplo entero de 8.

//Por lo tanto, solo se necesita Lie/8 1 byte para almacenar la fuente.

}

memset(Mozi, 0, 2048); //Establece la matriz de fuentes en todos ceros.

for(I = 0; I lt lie; i){

for(j = 0; j lt lie; j){

If (( temp = 0) amp; amp(j==Mentira-1) ){

for(k = 0;k lttemp;k){

g=(int) GetPixel (hdc, j*8 k, I);

if(g lt; 0x00808080)

Mozi[i*Lie j] = (unsigned

char )pow(2,7-k);

}

}

En caso contrario {

for(k = 0 ; k lt8 ; k ){

g=(int)GetPixel(hdc,j*8 k,I);

if(g lt;0x00808080)

Mozi [i*Lie j] =(unsigned

char)pow(2,7-k);

}

}

}

}

}

En el mensaje WM_PAINT, llame a GetZimo(hdcMem, cxBit-

Map, cyBitmap) para obtener el fuente de caracteres chinos. Al final del programa, también debes realizar algunos trabajos finales:

eliminar objeto(mapa hbit); //La descripción del dispositivo debe publicarse después de su uso.

//Manejadores de tablas y mapas de bits para evitar pérdidas de memoria

delete object(hNewFont);

DeleteDC(hdc mem);

Pintura superior (hwnd amp; PS);

Regresar 0; //Regresar después de procesar el mensaje WM_PAINT.

4 Resultados de salida

Tome la palabra "Ting" como ejemplo. Después de que aparezca el cuadro de diálogo de selección de fuente, la fuente se selecciona como el nuevo estilo de canción y se selecciona la fuente. como de costumbre y el tamaño de fuente se selecciona como pequeño. Hang=24, Lie=3, almacenamiento 72 bytes. Las fuentes son 00H, 00H, 00H, 00H, 00H, 03H, 00H, 04H, 01H, 80H, 04H, 01H, 0CH, 04H, 3EH, F0H, 0CH, 00H, 7h. 18H, 8FH, F0H, 10H, 90H, 04H, 11H, BFH, FEH, 11H, 20H, 04H, 31H, 60H, 08H, 21H, 40H, 18H, 65438. Dibuje un código de matriz de puntos en el papel, que sucede a sea ​​la palabra "Ting" ", como se muestra en la Figura 1. A partir de cxBitmap y cyBitmap, podemos saber que el tamaño de la red de "Ting" es 24 × 24.

5 Conclusión

Utilizando el método de mapa de transposición de texto, se pueden extraer fuentes de varias fuentes de la rica biblioteca de fuentes de Windows y ya no se limitan a una sola fuente, por lo que Enriqueciendo el diseño del sistema de visualización electrónica. Extraer fuentes de fuentes de mapa de bits tiene algunas desventajas, la más importante de las cuales es que hay muy pocas fuentes para elegir. Además, se puede extraer una red de imágenes simple utilizando el método presentado en este artículo, que enriquece el diseño de sistemas de visualización electrónica.

Esto es del espacio de otra persona, pero no puedo entenderlo. Espero que ayude.