Laden...

[gelöst] Text Liniendicke / DrawString für s/w LCD mit geringer Auflösung

Erstellt von absalom vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.375 Views
A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren
[gelöst] Text Liniendicke / DrawString für s/w LCD mit geringer Auflösung

Hallo,

ich möchte DrawString verwenden, um Text auf einem grafischen s/w LCD mit geringer Auflösung (112x16 pixels) zu schreiben. Beispiel:


            Bitmap b = new Bitmap(112, 16);
            using (Graphics g = Graphics.FromImage(b))
            {
                Font font = new Font("Arial", 12);
                PointF pF = new PointF(0, 0);
                g.DrawString("Hallo Welt", font, Brushes.Black, pF);
                // ab hier wird das bitmap in den LCD Speicher geschrieben
            }

Jedoch besteht die Liniendicke des Textes immer aus mehreren Pixels, was die Lesbarkeit auf dem LCD sehr erschwert. Gibt es eine Möglichkeit die Liniendicke zu beeinflussen oder gibt es einen Font mit einer Liniendicke von 1?
Ein Pen lässt sich auf DrawString nicht anwenden.

Vielen Dank
absalom

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo absalom,

also bei mir hat der Font nur eine Schriftbreite von eins. Ich habe die folgende Bitmap mit deinem Code erstellt.

herbivore

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

Hallo Herbivore,

vielen Dank, dass du dir die Mühe gemacht hast. Bei mir sieht es allerdings komplett anders aus?!? Da sich bmp nicht hochladen lässt, habe ich ein png daraus gemacht.

Hast du eine Idee, wo die Unterschiede herkommen?

absalom

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo absalom,

hm, leider keine Ahnung. So dick ist die Strichstärke bei mir nicht mal, wenn ich das Font-Objekt mit FontStyle.Bold erzeuge.

herbivore

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo absalom,

welches Betriebssystem verwendest du denn?

Ist "Arial" überhaupt auf deinem System installiert?
Was ist mit anderen Fonts? Tritt mit denen das Problem auch auf?

Bist du dir sicher, dass der Fehler nicht erst beim Schreiben der Bitmap auf den LCD-Bildschirm auftritt? Schreibe den Code einmal direkt in das Paint Ereignis der Form.

Wie sieht denn deine dpi-Einstellung (systemweit) aus?
Eigentlich dürfte die sich zwar nicht auf Graphcs Objekte auswirken, die von Bitmaps erzeugt werden - aber trotzdem.

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

Hallo winSharp93,

ich verwende Vista 32-bit Home Premium.

Ich habe den Code etwas geändert um sicherzustellen, dass der Font verfügbar ist (ansonsten würde es bei FontFamily eine Fehlermeldung geben):


            Bitmap b = new Bitmap(112, 16);
            using (Graphics g = Graphics.FromImage(b))
            {
                FontFamily fontFamily = new FontFamily("Arial");
                Font font = new Font(
                   fontFamily,
                   12,
                   FontStyle.Regular,
                   GraphicsUnit.Pixel);
                PointF pF = new PointF(0, 0);
                g.DrawString("Hallo Welt", font, Brushes.Black, pF);
                b.Save("tmp.bmp", ImageFormat.Bmp);
                b.Save("tmp.png", ImageFormat.Png);
            }

Das selbe Problem tritt auch bei "Courier New" und "Andalus" auf. Wie du im Code siehst hat es noch nix mit meinem LCD zu tun. Seltsamerweise erzeuge ich mit diesem code ein bitmap welches komplett schwarz (mit der Windows Fotogalerie und mit Paint) ist. Beim .png ist es zumindest noch lesbar, wenn auch schlecht.

Deine Anregung den Code einmal direkt in das Paint Ereignis der Form zu schreiben kann ich zur Zeit nicht folgen, da ich mit Forms nicht wirklich gut vertraut bin und mir keine neue Baustelle aufmachen möchte (bzw erst wenn es die letzte Möglichkeit ist).

Wo kann ich die systemweite dpi-Einstellung checken?

Danke & Grüße
absalom

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo absalom,

was ist denn in anderen Programmen (Textverarbeitung oder auch nur Notepad): Wird da dein Arial auch so fett angezeigt? Oder ist es ein Problem, das nur in .NET auftritt?

herbivore

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

Hallo herbivore,
in Wordpad tritt das Problem nicht auf. Ich habe dann doch noch die Idee von winSharp93 aufgegriffen und direkt im Paint Ereignis der Form den code ausgeführt und um einen direkten Vergleich zu haben in einem bitmap:

public partial class Form1 : Form
    {
        private Bitmap bmp;
        private Graphics graphBMP;

        public Form1()
        {
            InitializeComponent();
            bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
            graphBMP = Graphics.FromImage(bmp);

            string str = "Arial 12";
            Font font = new Font("Arial", 12);
            graphBMP.DrawString(str, font, Brushes.Black, 0, 0);

            str = "Courier New 12";
            font = new Font("Courier New", 12);
            graphBMP.DrawString(str, font, Brushes.Black, 0, 20);

            str = "Candara New 12";
            font = new Font("Candara New", 12);
            graphBMP.DrawString(str, font, Brushes.Black, 0, 40);

            str = "DpiX=" + graphBMP.DpiX + " DpiY=" + graphBMP.DpiY;
            graphBMP.DrawString(str, font, Brushes.Black, 0, 60);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(bmp,0,0);
            Graphics gr = e.Graphics;

            string str = "Arial 12";
            Font font = new Font("Arial", 12);
            gr.DrawString(str, font, Brushes.Black, 160, 0);

            str = "Courier New 12";
            font = new Font("Courier New", 12);
            gr.DrawString(str, font, Brushes.Black, 160, 20);

            str = "Candara New 12";
            font = new Font("Candara New", 12);
            gr.DrawString(str, font, Brushes.Black, 160, 40);

            str = "DpiX=" + gr.DpiX + " DpiY=" + gr.DpiY;
            gr.DrawString(str, font, Brushes.Black, 160, 60);

        }
    }

Wird direkt das Paint Ereigniss verwendet ist alles gut. Nur sobald die Bitmap ins Spiel kommt sieht es schäbig aus. Woran mag das liegen?

Viele Grüße
absalom

Edit: Code und Anhang aufgrund herbivores Anmerkung im nächsten Beitrag geändert

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo absalom,

das ist mir weiterhin unerklärlich. Bei mir haben die Fonts auf beiden Wegen die gleiche Strichbreite. Ich wüsste auch nicht, warum das Zeichnen in einer Bitmap ein anders Ergebnis produzieren sollte als auf den Schirm.

BTW: Alle deine Texte [EDIT]werden wurden, bevor du das Bild ausgetauscht hast 🙂[EDIT] im gleichen Font ausgegeben. Das liegt daran, dass er aufgrund der "12" in den Strings, den Fontnamen nicht erkennt.

herbivore

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

um sicherzustellen, dass es beim normalen Zeichnen funktioniert, habe ich ein Rechteck hinzugefügt - ohne Probleme. Die Linienbreiten sind identisch.
Hat noch jemand eine Idee?
absalom

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo absalom,

es mal auf einem anderen Rechner probieren, wenn möglich auf mehreren anderen. Und wenn es überall funktioniert, den einen Rechner neu installieren. Drastisch, aber ich habe momentan keine andere Idee.

herbivore

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

Hallo herbivore,

ich werde so vorgehen, wie du vorschlägst und es erstmal an ein paar anderen Rechnern probieren, wenn es dort nicht auftaucht werde ich Vista neu installieren.

Vielen Dank für Deine/Eure Unterstützung!

absalom

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

hm, der erste andere Rechner bei dem ich es probiert habe bringt die selbe Anzeige wie bei meinem Rechner, also links fett rechts dünn?!?
absalom

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo absalom,

ich kann nur raten.

Ich hab hier Windows 2000. Könnte ein Unterschied zu XP sein. Wüsste ich aber auch nicht warum.

Vielleicht ist es abhängig von Application.EnableVisualStyles?

herbivore

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

Application.EnableVisualStyles war schon drin, aber auch ohne macht es keinen Unterschied. Ich habe übrigens Vista kein XP
Grüße
absalom

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo absalom,

ich habe gerade deinen Code kompiliert (das Problem lies mir einfach keine Ruhe) und bei mir sieht es exakt aus wie auf deinem Screenshot. Du bist also nicht alleine.

Jetzt lässt mir das Problem erst recht keine Ruhe mehr...

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

schön, geteiltes Leid ... 🙂

2.760 Beiträge seit 2006
vor 15 Jahren

Hmm... bei mir unter XP sind beide Ausgaben gleich...
[EDIT]
Mal den TextRenderer probiert?

5.742 Beiträge seit 2007
vor 15 Jahren

Mal den TextRenderer probiert?

Ja - gleiches Ergebnis.

//EDIT:
Auch das Hochsetzten von Graphics.TextRenderingHint zeigt keine Wirkung...

Das mir das nicht schon früher aufgefallen ist 🤔

5.742 Beiträge seit 2007
vor 15 Jahren

Aha - einen Schritt näher an der Lösung:
http://bytes.com/forum/thread495547.html

Ein Graphics.Clear(Color.White) wirkt Wunder...
Aber warum ist es nur unter Vista nötig?!?

Eigentlich sollte das Bitmap doch transparente Flächen unterstützen...

🤔 🤔 🤔

5.742 Beiträge seit 2007
vor 15 Jahren

Ja - ich noch mal 🙂

Um die Liste der "problematischen" Betriebssysteme nochmal zu erweitern bzw. zu vervollständigen:
Betroffen sind Windows Vista, Windows 7 Build 6801 sowie Windows Server 2007 (allesamt 32bittig).

Nicht betroffen ist Windows XP.

Sehr mysteriös...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo winSharp93,

lustigerweise hatte ich das Graphics.Clear sowieso drin, sonst war meine Bitmap schwarz. Und schwarzen Text auf schwarzem Grund kann man nicht so gut lesen. (Das kennt man ja von dem Show-Raumschiff von Hotblack Desiato bzw. Deaster Area.

herbivore

-
171 Beiträge seit 2007
vor 15 Jahren

Hi,

also ich habs auch direkt mal ausprobiert und bei mir scheint alles ok zu sein auch ohne Graphics.Clear.

Ich benutze Vista Business 32 bit, allerdings habe ich das ganze Aero-Gedöns deaktiviert, vielleicht hängt es ja damit zusammen.

Gruß Hades

So siehts bei mir aus:

A
absalom Themenstarter:in
65 Beiträge seit 2006
vor 15 Jahren

mit Graphics.Clear klappt es. (übrigens habe ich Aero nicht aktiviert)

Vielen Dank! 👍
absalom