free type 2 - farben der zeichen sind invertiert``?



  • hallo,
    ich versuche gerade mit hilfe der free type 2 bibliothek bitmaps aus
    schriften zu erstellen.
    dabei erhalte ich dieses ergebnis
    http://img829.imageshack.us/img829/9882/testwum.png

    ich hätte aber gern schwarze schrift auf weißem hintergrund.
    mache ich etwas falsch oder ist das so von den freetype entwicklern gewollt?
    😕



  • Das sind Alphawerte, demnach steht weiß für "volle Textfarbe" und schwarz für "volle Hintergrundfarbe".



  • alphawerte? wie kommst du darauf?
    laut doku sind das grauwerte

    ...
    Set it to FT_RENDER_MODE_NORMAL to render a high-quality anti-aliased (256 gray levels) bitmap, as this is the default.
    ...

    😕



  • Das passt schon. Verwende die Bitmap als Alphamap, um den Text auf einen beliebigen Hintergrund zu rendern.



  • ist also ein byte gleichzeitig grauwert und alphawert?
    ich habe hier etwas über alphablending gefunden:
    http://de.wikipedia.org/wiki/Alpha_Blending
    da lese ich mich morgen etwas ein, jetzt ist der kopf voll 😃

    wieso sind denn im wiki-beispiel

    (0.5,0,1,0.75)

    die farbwerte und der alpha-wert als kommazahl angegeben?
    welche vorteile hat das?
    😕



  • Auf einem Computerbild mit 4 Bytes pro Pixel hat man 4 Kanäle (ARGB): 1. Alphawert, 2. Rot, 3. Grün, 4. Blau. Diese 4 Kanäle sind auf die 4 Bytes verteilt. Ein Kanal hat somit immer einen Wert von 0-255.
    Wenn man in der Bildverarbeitung nur einen Kanal bearbeiten möchte, macht man dies über Graustufenbilder, da ein farbloses graues Bild nur ein 1 Byte pro Pixel mit einem Kanal hat: Weiss bis Schwarz verteilt über 0-255.

    Du hast nun ein Bild mit Grauwerten (0-255) und sollst diese Grauwerte als Alphawerte nehmen. Ob man die Zahlen 0-255 als Grauwerte oder Alphawerte verwendet, kümmert ja den Computer nicht. Grauwerte lassen sich einfach besser darstellen als reine Alphawerte 😉

    In Wikipedia werden Kommastellen verwendet, weil man sowas auch mit Prozentzahlen angeben kann, also: 0.0-1.0. Um den tatsächlichen Wert herauszufinden muss man diesen Wert dann noch mit dem grösstmöglichen Wert multipliziert werden. In unserem Fall wäre dies 255, wodurch man wieder auf eine Verteilung von 0-255 kommt. Es gibt aber halt auch Bilder, welche pro Kanal 2 Bytes verwenden, dann wäre der Höchstwert 65535. Die Prozentzahl verändert sich nicht, der absolute Wert dagegen schon, weshalb die Prozentzahlen unabhängiger sind.

    Grüssli



  • mir ist leider noch nicht klar, wie ich die pixelwerte berechne.
    ich bekomme von free type 2 also die 8 bit grauwerte und möchte diese
    in einer 32 bit bitmap speichern.
    was ich bisher mit einem grauwert gemacht habe ist folgendes

    unsigned char pixel8bit = bitmap->buffer[q * bitmap->width + p];
    unsigned int pixel = ( 0xFF << 24 | pixel8bit << 16 | pixel8bit << 8 | pixel8bit );
    

    angewendet auf alle grauwerte eines buchstabens ergibt z.b. das verlinkte A.
    nun möchte ich aber einen weißen hintergrund mit schwarzer schrift.
    wie gehe ich vor?

    wie empfohlen habe ich die grauwerte als alphawerte betrachtet und habe die pixel
    nach der formel C = αAA + (1 − αA)B berechnet
    http://de.wikipedia.org/wiki/Alpha_Blending

    das kommt mir ziemlich umständlich vor und dieses vorgehen ist vermutlich falsch, denn da kommt nur grütze bei raus.
    ich habe auch das versucht:

    if ( pixel == 0xFFFFFFFF )
    pixel = 0
    else if (pixel = 0)
    pixel = 0xFFFFFFFF
    

    das gibt aber an den anti-aliasing pixeln optischen müll.
    irgend etwas mache ich noch falsch, aber was. 😕



  • jetzt gehts! 🙂
    ich hatte nen fehler in der formel drin, denn ich habe die erhaltenen 8 bit werte als alphakanal und als farbwerte gleichzeitig behandelt 🙄
    es sind in der tat lediglich alphawerte.
    vielen dank @Athar für den tipp mit den alphawerten, sonst wäre ich da nie drauf gekommen 👍


Log in to reply