Que formato de fonte é esse?

3

Uma exibição de E Ink que comprei suporta exibição de texto usando um comando interno. De acordo com a documentação, também me permite carregar uma "biblioteca de fontes" diferente para caracteres chineses:

Font libraries

The system built-in 32, 48 and 64 dots English font is always available without using the TF card or the NandFlash; however, for the 32, 48 and 64 dots Chinese font, you should store the relative library file to the TF card or the NandFlash before using it.

Encontrei uma amostra de um desses arquivos de fonte em uma biblioteca do GitHub para esta exibição: GBK32 .FON , GBK48.FON e GBK64.FON .

Infelizmente, isso é o máximo que eu consegui.

  • file não produz nada útil ( GBK32.FON: data )

  • FontForge só me dá um erro: GBK32.FON is not in a known format (or uses features of that format fontforge does not support, or is so badly corrupted as to be unreadable)

  • TrID produz 100.0% (.ABR) Adobe PhotoShop Brush (1002/3) , mas não consegui abrir os arquivos no Photoshop

  • PSFTools não o reconhece como um arquivo Windows válido .FON ou .FNT

  • Um editor hexadecimal mostra que não há um número mágico - na verdade, os primeiros 15 bytes em todos os três arquivos são apenas zero

  • Com base no tamanho dos arquivos, parece que os arquivos são um tipo de bitmaps (tamanho de GBK32.FON / 32 ^ 2 = tamanho de GBK48.FON / 48 ^ 2 = tamanho de GBK64.FON / 64 ^ 2)

Existe alguma fonte de bitmap "conhecida" que possa se encaixar nessa descrição? O que mais eu poderia tentar descobrir este formato?

    
por fstanis 09.06.2017 / 00:58

2 respostas

4

Eu assumi que os caracteres são bitmaps em preto-e-branco de dimensões constantes. A codificação mais primitiva seria armazenar a cada 8 pixels consecutivos como bits em um único byte. É simples, não muito exigente em termos de desempenho e tem a grande vantagem de todos os caracteres terem o mesmo número de bytes, portanto, é possível saltar para qualquer personagem que você precise.

Eu hackeei um script Python simples para testar essas suposições. Ele processa esses arquivos, substituindo cada byte por sequências de 8 caracteres que consistem em (espaço) e # respectivamente para 0 e 1 bits na ordem big endian. Isso torna os arquivos de saída visíveis em qualquer editor de texto que possa manipular arquivos tão grandes. Aqui está o código e aqui está o GBK32.FON processado com um conjunto de linhas de 32 caracteres:

Como você deve ter adivinhado, o glifo tem 32 pixels de altura.

    
por 09.06.2017 / 01:56
1

Meu Deus! Eu fui pedir ajuda, mas uma caixa de dica apareceu evitando pedir ajuda ... hehe assim, três dias depois eu fiz isso sozinho, então eu pensei em compartilhar algumas dicas extras.

Puxar o arquivo para o Java é muito fácil.

Para importar o uso de glifos (pseudocódigo) ,

BufferedInputStream bf = new BufferedInputStream(importGBKFileStream);

byte glyphline[] = new byte[glyphBitWith/8];  // 64 for GBK 64

while (bf.available() > 0) {

bf.read(glyphline);
for(int i = 0 ; i < glyphline.length ; i++){

String s = ("0000000" + Integer.toBinaryString(0xFF & glyphline[i])).replaceAll(".*(.{8})$", "$1");

... etc

Para exibir os glifos no EPD

Depois de algumas conversas, você precisa enviar dois Bytes para o EPD para cada personagem. Esses caracteres começam em (byte superior) 0x81, (byte inferior) 0x40.

Esta é uma boa referência, link para ver como o conjunto de dados GBK é apresentado. Outra referência útil são estas link

Criando uma fonte personalizada (pseudocódigo)

Faça o download de um arquivo .ttf e abra-o em java

    Font font = Font.createFont(Font.TRUETYPE_FONT, inttf);
    font = font.deriveFont((float) 64); 

    // for all characters in ASCII table

    text = Character.toString(chara);

    img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_BINARY);
    g2d = img.createGraphics();

    g2d.setColor(Color.BLACK);
    g2d.fillRect(0, 0, imageWidth, imageHeight);
    g2d.setColor(Color.WHITE);
    g2d.setFont(font);
    fm = g2d.getFontMetrics();

    // for all ascii values 0 - 256,  xpos
    g2d.drawString(text, 0, fm.getAscent());

    // use the character and the derrived with from the FontMetrics to
    // create a map for spacing the text manually                         
    characterWidthLogger(chara, textWidth);

    // should have the image as a dataByte buffer
    WritableRaster raster = img.getRaster();
    DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();

    // output the data to a file or screen                                 
    displayByteArray(data ,imageHeight, imageWidth);

O characterWidthLogger () é importante. No micro que controla o EPD eu uso o mapa characterWidth para definir o espaçamento como. Portanto, um comando "Text" se torna 4 comandos separados ((x0, y0, "T"), (x0 + largura 'T ", y0" e ") etc.) e cada caractere é convertido para o formato chinês. Onde você coloca os glifos dentro de seus arquivos GBK é com você. O epd só permite que os três arquivos GBK32, GBK48 e GBK64. Eu copiei sobre os glifos chineses no início 0x81 superior, menor 0x80. So T, que é ascii 0x54 torna-se 0x81, 0xD4.

Espero que ajude

Hayden

    
por 12.07.2017 / 08:39