[dowolny] zapis tekstu do pliku graficznego

0

Witam, mecze sie juz jakis czas z problemem zapisu tekstu do pliku graficznego.

Na poczatku chcialem literki sobie porobic jak w ascii art i tablice prawdy 8x8 dla kazdego znaku, w ktorym miejscu ma byc piksel, podczas rysowania danej litery.
No niestety troche z tym za duzo roboty oraz troche miejsca zajmuje w pamieci, a generacja znowu trwa. Natrafilem w koncu na jakies przyklady jak to w winapi ogarnac, niestety winapi mnie w tym przypadku nie interesuje. Dobra dalej znalazlem biblioteke libotf, niestety wersji pod windows'a nie moge znalezc, a program ma byc miedzy innymi pod ten system, wiec nie bardzo mi pasuje takie rozwiazanie, nawet zreszta niewiem czy moge wykorzystac tego liba do takich celow.

Formaty plikow jakie mnie interesuja to tga, png i bmp.

Caly ten tekst jest mi potrzebny tylko do wygenerowania jednego pliku, przedstawiajacego pewna strukture, po prostu chce narysowac cos takiego jak graf.
Oczywiscie prostokaty, linie i takie tam to nie problem, ale ten tekst to niewygodna sprawa.

Jest to jedna z funkcji programu, a nie chce jakos tego nie fortunnie zorganizowac, aby to nie zajmowalo wiecej pamieci i czasu niz reszta zadan razem wzietych.
Jeszcze dodam, ze wszystko generuje automatycznie, wiec zadnego rysowania czy czegos jak w gimpie nie ma.

Moze ktos z Was ma jakis pomysl jak do tego podejsc lub robil juz cos takiego ?
Bede wdzieczny za wszelkie sugestie i informacje.

0

Chcesz rysować tekst na bitmapie, czy tylko zapisać go do pliku (jakaś zakodowana informacja, czyli niewidoczna na obrazku)?

  1. normalnie - jak na ekran, np. TextOut.
  2. zapisujesz w bajtach pierwszej linii bitmapy i tyle, albo na najmłodszych bitach (kolor nie zmieni się istotnie) - po jednym w kolejnym bajcie... potem składasz te bity, np. po 8 sztuk, i masz znaki tekstu (+ suma kontrolna, po której poznasz, czy w obrazku zakodowano tekst).
0

No wlasnie to co chce zrobic nie jest tak proste jak te rzeczy, o ktorych mowisz ;/

Napisalem, ze chce stworzyc rysunek, przedstawiajacy graf, a w tym grafie chce rozne rzeczy pozapisywac, czyli zamiast pisac do pliku albo umieszczac tekst bit po bicie w najmlodszym bicie kazdego bajtu pliku bmp chce normalnie pisac po pliku, dlatego rozwazam rozne opcje oraz zapytalem sie o inne niz te ktore przedstawilem i o rade ewentualnie ktora z tych mozliwosci uzyc.

Szczerze mowiac temat jest mi obcy, nigdy nie potrzebowalem rysowac tekstu w obrazie.

Od czasu tego mojego postu zdarzylem przejrzec kody zrodlowe libpng, libbmp oraz libtiff.
Jest pewnien sposob, aby format tiff wykorzystac, ale jesli jest jakis wydajny i przenosny sposob rysowania tekstu w tych formatach co wymienilem, to wolalbym przy nich pozostac, poniewaz ich struktury sa mi dobrze znane.

Jak juz wczesniej napisalem najbardziej mi zalezy na przenosnosci kodu miedzy Linuksem, a Windowsem w tym rozwiazaniu.

0

Ty chyba chcesz normalnie graf zapisać - zwyczajne dane.
Do tego nie potrzeba obrazków - te możesz sobie rysować na podstawie tego grafu.

0

To czego chcesz, to czcionka rastrowa. Przechowuje się je np. w takich obrazkach, a potem przekleja literkę do docelowego obrazka (pozycję literki w czcionce trzeba sobie wyliczyć).
http://www.fpga4fun.com/images/Font8x8.gif

0

@Azarien: dzieki wielkie za odpowiedz, nawet nie wiedzialem o istnieniu czegos takiego, kompletnie poza tematem bylem :)

0

Jakby kogos interesowalo to zrobilem to w ten sposob od strony kodu:

bool BMP::drawText(FILE *fp_out, DWORD x, DWORD y, const char *str)
{
    bool buff[8];
    int len, i, j, k;

    y = this->height - y;     // BMP niestety odwroctnie ma :D

    len = strlen(str);

    if(this->isFont == false)
    {
        this->createFont();
    }

    for(i = 0; i < len; i++)
    {
        for(j = 0; j < 8; j++)
        {
            this->decToBin(this->font[str[i]][j], buff);

            for(k = 0; k < 8; k++)
            {
                fseek(fp_out, 54+1024+(y-j)*this->width+x+k+(i*9), SEEK_SET);
                if(buff[k])
                {
                    fputc(4, fp_out);
                }
            }
        }
    }

    return true;
}
bool BMP::createFont()
{
    FILE *fp;
    int i, j;
    char z;

    this->font = new BYTE*[128];
    if(this->font == NULL)
    {
        return false;
    }

    for(i = 0; i < 128; i++)
    {
        this->font[i] = new BYTE[8];
        if(this->font[i] == NULL)
        {
            return false;
        }
    }

    fp = fopen("font.txt", "r");
    if(fp == NULL)
    {
        return false;
    }

    for(i = 0; i < 128; i++)
    {
        for(j = 0; j < 8; j++)
        {
            fscanf(fp, "%X%c", &this->font[i][j], &z);
        }
    }

    fclose(fp);

    this->isFont = true;

    return true;
}

Kawalek pliku z czcionka 8x8, w ktorym kazdy bit kolejnej liczby okresla, czy trzeba mazac pixel, czy nie
w kazdej lini jest opisana dokladnie jedna litera.

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7E 0x81 0xA5 0x81 0xBD 0x99 0x81 0x7E
0x7E 0xFF 0xDB 0xFF 0xC3 0xE7 0xFF 0x7E
0x6C 0xFE 0xFE 0xFE 0x7C 0x38 0x10 0x00
0x10 0x38 0x7C 0xFE 0x7C 0x38 0x10 0x00
0x38 0x7C 0xEE 0xEE 0xEE 0x38 0x38 0x7C
0x00 0x10 0x38 0x7C 0xFE 0x7C 0x38 0x7C
0x00 0x00 0x18 0x3C 0x3C 0x18 0x00 0x00
0xFF 0xFF 0xE7 0xC3 0xC3 0xE7 0xFF 0xFF
0x00 0x3C 0x66 0x42 0x42 0x66 0x3C 0x00
0xFF 0xC3 0x99 0xBD 0xBD 0x99 0xC3 0xFF
0x0F 0x07 0x0F 0x7D 0xCC 0xCC 0xCC 0x78
0x3C 0x66 0x66 0x66 0x3C 0x18 0x7E 0x18
0x3F 0x33 0x3F 0x30 0x30 0x70 0xF0 0xE0
0x7F 0x63 0x7F 0x63 0x63 0x67 0xE6 0xC0
0x18 0xDB 0x3C 0xE7 0xE7 0x3C 0xDB 0x18

Wygenerowalem taki pliczek za pomoca programu 8x8 Pixel Rom Font Editor, duzo czcionek rastrowych jest zalaczonych z tym programem, ale w postaci plikow c64 i pf, lecz program bez problemu generuje wlasnie taki zapis w hex'a jak wyzej podalem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1