Forum: Mikrocontroller und Digitale Elektronik font editor 2bpp


von Bernd S. (mms)


Lesenswert?

Hallo,

gibt es auch einen Font Generator der mir Fonts mit 2bpp erstellt (und 
diese als C-File ausgibt)?

Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Soll das 2bpp 2 bytes per pixel heißen oder was? P.s. wenn ja willst du 
bunte Schriften machen?

Gruß ErgoProxy

von Bernd S. (mms)


Lesenswert?

2bpp (bit per pixel) - ich möchte gern zwei Graustufen darstellen.


Der Epson Controller arbeitet im 2bpp Modus so, dass die 8Bit Schrift in 
4Bit unterteilt wird. D.h. wenn beide 4Bit gleich sind (gleich gesetzt 
werden) bekommt man Schwarz, wenn nur die ersten 4Bit gesetzt sind ein 
helles Grau, wenn nur die höheren 4Bits (der 8Bits) gesetzt sind, erhält 
man ein dunkles Grau.

Bei einer "normalen" 8Bit Schrift mit 1bpp werden jetzt gewisse Passagen 
bei den Buchstaben Grau dargestellt, da sich die lower und higher 4Bits 
nicht entsprechen. Das ist natürlich vom Lesen her nicht so schön / bzw. 
leserlich.

Deshalb such ich entweder ein Programm, welches mir gleich eine schöne 
Schrift / Buchstaben mit 2bpp liefert oder ich muss die Buchstaben 
(wahrscheinlich) per Hand abändern, so dass alle Black/White dargestellt 
werden.

Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Versteh ich das richtig ?

Zeile (4 bit) schwarz:   0xFF
Zeile (4 bit) helles grau: 0x0F
Zeile (4 bit) dunkles grau: 0xF0
Zeile (4 bit) weiß: 0x00

Ist das so codiert? Also 8 (MSB) und 4 ergebn zusammen einen Pixel ?

von Bernd S. (mms)


Lesenswert?

fast habs mir grad mal im Display selbst angeschaut... hab mich etwas 
vertan.

0x81 = 1000 0001 = 1.Pixel(10) 2.Pixel(00) 3.Pixel(00) 4.Pixel(01)

es heißt zwar 2bpp im Datenblatt aber effektiv kann man nur 00 = weiß, 
01 = grau und 11 = schwarz darstellen...

Für mich (arbeite zum ersten Mal mit so einem Display) sehr komisch - 
aber so ist es auf jeden fall beim Epson Controller S1D13700)

Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Und du hast den "alten" Font Code in c? und im prinzip musst du doch nur 
beim Senden schauen ob das Bit vom Font, dass du senden willst, eins 
ist, dann schreibst du in einer Puffervariablen 2 einsen rein und so 
weiter und sendest dann diese 16bit anstelle der 8bit.

z.b. Font:

0b10011000 -> 0b1100001111000000
1
uint16_t umwandlung(uint8_t data)
2
{
3
 for(i=0;i<8;i++)
4
 {
5
   uint16_t temp;
6
   if(data & (1<<i)
7
   {
8
     temp |= (1<<(2*i)) | (1<<(2*i+1);
9
   }
10
 }
11
 return temp;
12
}

Da sollte (ich hab das eben grade getippt ^^) jetzt beim durchlaufen 
jedes Bit verdoppelt werden und das kannst du dann einfach senden.

Gruß ErgoProxy

von Andreas K. (ergoproxy)


Lesenswert?

Gabs hier nicht mal die Möglichkeit Beiträge zu bearbeiten?!
Da fehlt noch eine Klammer bei der if Anweisung und weiter unten noch 
eine bei der zweiten Temp zuweisung.
1
uint16_t umwandlung(uint8_t data)
2
{
3
 for(i=0;i<8;i++)
4
 {
5
   uint16_t temp;
6
   if(data & (1<<i))
7
   {
8
     temp |= (1<<(2*i)) | (1<<(2*i+1));
9
   }
10
 }
11
 return temp;
12
}

So sollte es stimmen.

von Bernd S. (mms)


Lesenswert?

vielen Dank für dein C-Code. So funktioniert es! Habs grad mit einem 
einzelnen Buchstaben ausprobiert.

Gibt es auch ein Programm mit dem man 2bpp Bilder als Bitmap erzeugen 
kann? Wie wird diese Graustufe im Bitmap (Hexwerte) dargestellt / 
codiert?

So dass ich Bilder mit dieser einen Graustufe auf dem Display darstellen 
kann.

Gruß
Bernd

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Schau mal an, was ImageMagick so drauf hat.

Als Graymap passt vielleicht ein PGM oder ein MS-BMP mit 2 Bitplanes.

In welchem Format liegen denn die Fonts vor?

Evtl. binär einlesen, nach PGM oder PPM konvertieren mittels C und dann 
weiter zu den bebrauchten Formaten (PNG, BMP, ...) bzw. umgekehrt wenn's 
in die andere Richtung gebraucht wird.

von Bernd S. (mms)


Lesenswert?

>Als Graymap passt vielleicht ein PGM oder ein MS-BMP mit 2 Bitplanes.

hab mir das Fileformat mal angeschaut.. im Normalfall hat PGM P2 16 
Graustufen (von 0 bis 15)und P5 (255 Graustufen)... aber mit zwei Planes 
gibt es dass auch nicht.


Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Hm du hast n Bitmap und davon die Rohdaten? Z.b. 255 Farben oder was 
weiß ich. Dann machst du das so, dass du alle Farben addierst und dann 
durch 3 teilst. Ist der Wert unter 1/3*255 dann setzt du dieses Pixel 
schwarz. Ist es über 2/3*255 dann setzt du es weiß und alles dazwischen 
setzt du grau.

Wenn ich ehrlich bin ich hab mich mit dem Bitmap als Kontainer noch 
nicht ausreichend beschäftigt um da jetzt einen Quellcode zu schreiben 
aber im Prinzip ist er sehr einfach wenn man erstmal die Rohdaten also 
die einzelnen Pixelwerte hat. Da es mich eh interessiert schau ich mir 
gleich mal das BMP-Format an und schau ob ich da was machen kann. Wollte 
ich eh da ich grade ein S65 am Mega8 zum laufen bekommen hab und das 
einen etwas gewöhnungsbedürftiges Farbformat hat, das ich aus einem 
normalen BMP erstmal machen müsste.

Gruß ErgoProxy

von Bernd S. (mms)


Lesenswert?

hab grad mal etwas am Kontrastregler gedreht und es sind tatsächlich 4 
Grautöne. Das mit der Schrift passt aber trotzdem.

00 = weiß
01 = helles grau
10 = dunkles grau
11 = schwarz


Wenn man das Bitmap mit 16 Graustufen abspeichert, müsste man es auf 4 
Graustufen herunter-gecodet bekommen.

Mit welchem Display / Controller arbeitest du zurzeit?

Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Da ich glaube das Format verstanden zu haben wer ich mal versuchen dir 
ein kleines Prog zu schreiben, dass die Daten in was für dich 
verständliches (ich meine dein Display ^^) umwandelt. Wie willst du dem 
Ding denn die Bitmap senden? Mit Header oder als Pixelrohdaten? Uns soll 
es von unten nach oben also letzte Zeile zuerst oder umgekehrt kodiert 
sein? Soll es das Zeilenende mit 0000 beibehalten und haben die Bilder 
immer eine feste größe, dass man den Header weglassen könnte? Oder soll 
ich alternativ einen eigenen Header einfügen mit den Daten:

2-BM(4Byte), Höhe in Pixeln (4Byte), Breite in Pixeln (4Byte) und dann 
die Rohdaten ohne Zeilenumbruch?

Müsstest mir nur sagen, wie du es brauchst, da ich das bisher aber noch 
nie gemacht hab kann ich nicht versprechen, dass ich es hinbekomme ^^ 
ich sollte es aber schaffen.

Gruß ErgoProxy

Edit: In welchem Format liegen denn deine BMPs momentan vor? p.s keine 
Ahnung welcher Contoller in meinem S65 werkelt ich hab ein LPHxxxx hab 
den Code aus der Codesammlung verwendet. Problem ist halt nur das die 
Farben in 5-6-5 Bit codiert sind und nicht wie normal in 255-255-255.

von Bernd S. (mms)


Lesenswert?

einen Header vor den eigentlichen Rohdaten wäre super...
- Höhe, Breite in Pixel, Farbtiefe (1bbp oder 2bpp, oder 0bpp), 
Startwert (wo die Daten beginnen sollen vom eigentlichen Bild), Endwert 
(damit man das Bild auch umgekehrt darstellen kann)

Im Normalfall (default) soll das Bild links oben anfangen. Wenn die max. 
Größe von 320x240 nicht erreicht werden, kann man 0x00 dranhängen -> 
allerdings wäre dass dann durch den Start- und Endwert im Header 
hinfällig.


>In welchem Format liegen denn deine BMPs momentan vor

speichere sie immer davor bereits als BMP (16 Graustufen = 4Bit) ab. 
Dann ist die eigentliche konvertierung danach nicht so schwierig.

Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Ich werd mal versuchen sowas zu schreiben, allerdings fände ich es 
lecihter wenn man vorher das Standartformat mit 24bit Farbtiefe 
verwendet und das dann runterrechnet. du musst ja trotzdem nur 4 Farben 
verwenden. Z.b. Schwarz, weiß, hell und dunkelblau. Nur dann ist es 
einfacher weil dann keine Farbtabelle im Header ist den ich dann 
auswerten muss usw ^^

Gruß ErgoProxy

von spess53 (Gast)


Lesenswert?

Hi

>Im Normalfall (default) soll das Bild links oben anfangen. Wenn die max.
>Größe von 320x240 nicht erreicht werden, kann man 0x00 dranhängen...

Bitte beachten: Die Daten werden in Bitmaps von unten nach oben 
gespeichert. Erstes Datenbyte ist links unten.

MfG Spess

von Bernd S. (mms)


Lesenswert?

>Ich werd mal versuchen sowas zu schreiben, allerdings fände ich es
>lecihter wenn man vorher das Standartformat mit 24bit Farbtiefe
>verwendet und das dann runterrechnet. du musst ja trotzdem nur 4 Farben
>verwenden. Z.b. Schwarz, weiß, hell und dunkelblau. Nur dann ist es
>einfacher weil dann keine Farbtabelle im Header ist den ich dann
>auswerten muss usw ^^

ok, das hab ich nicht bedacht....

von Hansi Glaser (Gast)


Lesenswert?

Hi!

Sobald du die Daten in einem einfachen Format (also z.B. BMP) vorliegen 
hast und für jeden Pixel den Helligkeitswert hast, kannst du ganz 
einfach auf 2bpp konvertieren. Am Besten natürlich im PC (weil die 
Arbeit dann nur 1x gemacht wird, und der uC die vorbereiteten Daten nur 
mehr verwenden braucht). Es kann aber auch der uC machen, es könnte aber 
etwas langsam sein.

Aber wie macht man das? Einfach die 2 MSB verwenden.

Angenommen du hast 8bpp (also 0..255), dann die 8-2 = 6 LSB entfernen. 
Also einfach "shr 6" oder in C ">> 6". Das entspricht einer Division 
durch 2^6 = 64. Und wenn du 0..255 durch 64 dividierst, hast du schön 
0..3 (also 2bpp).

Bei 4bpp (also 0..15) Graustufen einfach 4-2 = 2 LSB entfernen, also 
"shr 2".

Dann brauchst nur noch das "rundherum", also die Daten für jeden Pixel 
aus dem Bild mit den tiefen Farben heraus lösen, und nach dem 
konvertieren sie ins Display zu schreiben.

Am Einfachsten "pnmdepth" verwenden (siehe Manpage) aus dem NetPBM 
Packet. Das Fileformat für die "Portable Grey Maps" ist in der Manpage 
"pgm(5)" erkärt.

Bye
  Hansi

von Andreas K. (ergoproxy)


Lesenswert?

So bin bald fertig damit ^^ sry das es so lange dauert aber ich hab fast 
ne Stunde gebraucht um herauszufinden warum einige wenige Bytes nicht so 
vom Filestream gelesen wurden wie sie sind... Wenn man einen 
StreamReader verwendet ... und nicht wie eigendlich logisch den §"$)"§IR 
BinaryReader ^^ mit dem es einwandfrei geht. Nuja jetzt gehts schonmal 
den Dateiheader fehlerfrei zu lesen. Jetzt muss ich nurnoch die 
Umwandlung und das Speichern schreiben.

Gruß ErgoProxy

von Andreas K. (ergoproxy)


Lesenswert?

So ich habs fast fertig, allerdings schreibt es die Bilder immernoch von 
der untersten Zeile zur obersten. Header ist momentan 12Bit:

Höhe(4bit), Breite(4Bit) und Farbtiefe(4Bit) alle drei little endian.

Versuch das noch etwas zu kürzen. Liegt an der Länge von unsigned int, 
dass die so groß sind.
Ich werde jetzt die ganzen Testteile aus dem Program entfernen und dann 
sollte es laufen... Es scheint sogar mit sehr großen BMPs klarzukommen.

Da ich grade aber keine Lust mehr zu hatte, hat es keine graphische 
Ausgabe, des Ergebnisses, dass müsstest du mal testen. Momentan rechnet 
er einfach alle Farben zusammen:
Alle Farben addiert
<255 -> schwarz
<255*2 -> dunkelgrau
<255*3 -> hellgrau
oder größer -> weiß

Werde noch 4 Regler dranmachen, mit denen man das verändern kann. 
Wahrscheinlich lad ich das Programm aber erst morgen mittag hoch ^^ ich 
hab eigendich grade keine Lust mehr den Rest zu schreiben.

Gruß ErgoProxy

von Bernd S. (mms)


Lesenswert?

bin auch bereits am Schreiben von so einem Programm (bis jetzt wird 
bitmap eingelesen und die Farbwerte von 24bit-Bitmaps werden in Luminanz 
umgewandelt)

-> 000 - 063 entspricht weiß
-> 064 - 127 entspricht hellem Grau
-> 128 - 191 entspricht dunklem Grau
-> 192 - 255 entspricht Schwarz


Bernd

von Andreas K. (ergoproxy)


Angehängte Dateien:

Lesenswert?

So hier mal wie versprochen die erste Version. Über rückmeldung würde 
mich mich freuen, besonders ob die Bitmaps stimmen ^^ ich hab es 
immernur im Hexeditor betrachtet und nicht in real ob alle Pixel an der 
richtigen stele und richtig konvertiert sind.

Header ist gleichgeblieben:
Höhe(4bit), Breite(4Bit) und Farbtiefe(4Bit) alle drei little endian.

Dann kommen die Pixeldaten auswählbar: Vom Zeilenende nach oben(wie 
normale Bitmap) oder aber wie auf einem Blatt von oben links nach unten 
Rechts zeilenweise.

Es wird nichts eingefügt, wenn die Zeile zuende ist und das 8-Bit Wort 
noch nicht voll ist. Außname ist das Ende der Datei hier wird der 
Überstand geschrieben, der noch zum vollen 8Bit Wort gefeht hat (mit 0en 
aufgefüllt)

Gruß ErgoProxy, der sich jetzt mal an nem Leseprogram versucht, das den 
kram visuell darstellen kann ^^

von Bernd S. (mms)


Lesenswert?

werd ich mir gleich mal anschauen - mein Prog läuft mit der 24Bit 
Variante - muss aber noch diverse hilfsfunktionen etc. rausnehmen etc.



Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Hm also ich schau mir den kram grade nochmal an aber entweder ich hab 
bei der Umwandlung nen Fehler drinn oder in meinem Program zur 
Darstellung =/
Wär super wenn du mir sagen könntest ob es bei deinem Display geht^^. 
Dann wüsste ich zumindest, ob das Umwandlungsprogram geht.

Gruß ErgoProxy

von Bernd S. (mms)


Lesenswert?

als welches Format muss ich es denn abspeichern?

Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Wie du die Datei nennst ist dir überlassen, da es ja eine eigenkreation 
ist.

Solange du sie auswertest, wie der header da oben sagt ist es keinerlei 
Problem.

Gruß ErgoProxy

von Andreas K. (ergoproxy)


Lesenswert?

So habs zum laufen bekommen -... mehr oder weniger ... bei dem Program 
zum umwandeln stimmt etwas nicht mit dem Teil, der die Pixeldaten die 
Zeilen tauscht. D.h. Wenn man das Bitmap als "Zeilen von unten nach 
oben" speichert gehts mit dem anderen nicht.

Der Reader geht jetzt auch aber die Funktion die ich zum zeichen 
verwende ist einfach viel zu lahm und CPU lastig, um damit größere 
Bilder darzustellen. Auch fehlt noch die Möglichkeit die falsch rum 
gedrehten BMPs richtig herum darzustellen.

Werd mal die Probleme beim Konverter beseitigen und dann nochmal 
hochladen.

Gruß ErgoProxy

von Bernd S. (mms)


Angehängte Dateien:

Lesenswert?

aber wenn ich sie als xyz.c / .h. / .txt speicher - ist der Inhalt der 
Datei nicht korrekt....


anbei mal mein kleines (prog) - alles alpha-...
Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Willst du die Bilddaten denn als C-Code haben XD musst du doch sagen ^^ 
momentan macht der daraus einfach einen binären Filestream, der in einer 
Datei gespeichert wird, die man dann z.b. auf einer Speicherkarte lagern 
kann oder aber über die serielle Schnittstelle schicken kann.

Gruß ErgoProxy

Eddit: An was für einem µC hast du das eigendlich hängen, dass du die 
Bilder in einem Array in den Ram rein baust? Das wird ja schon sehr 
schnell unglaublich viel Speicher, der da weg ist.

von Bernd S. (mms)


Lesenswert?

ah ok, das erklärt das natürlich....

ja im Endeffekt soll das Programm ja den C-Code gleich liefern, so dass 
man ihn nur noch einbetten muss in das eigentliche Programm

Edit: Die Bilder befinden sich nicht im RAM, sondern im externen 
Flash-Memory - als Controller verwend ich grad den LPC214


Bernd

von Andreas K. (ergoproxy)


Lesenswert?

So ich hab bei mir mal alle Fehler beseitigt (die ich gefunden hab ^^) 
und noch eine nach C-Array exportieren Funktion gebastelt. Allerdings 
muss man als "zwischenspeicher" über die Binärdatei gehen, die man mit 
dem normalen Converter erstellt.

Der Viewer funktioniert jetzt auch richtig, wenn auch immernoch nur mit 
kleinen Dateien, da große wohl zuviel Auffwand darstellen. Werd mich 
wohl irgendwann mit DirektX dafür anfreunden müssen ^.^

Dabei ist noch ein Bild, das ich als Testbild verwendet habe. 
Erstaunlicherweise erkennt man es immernoch sehr gut als 2Bpp Bild. Habs 
also mal mit rein getan. Die ".gray" Dateien sind die umgewandelten 
Bilder, in 2Bpp. Die kann der Viewer lesen. Beim Viewer ist oben n Zoom 
regler.

So ich muss jetzt erstmal n bisi weiterlernen ^^ wenn ich nix fürs Abi 
mach bringt mich meine Mutter um XD (p.s. Das ist NICHT ERNST gemeint^^)

Gruß ErgoProxy

von Andreas K. (ergoproxy)


Angehängte Dateien:

Lesenswert?

Blöder Dateianhang ^^

von Bernd S. (mms)


Lesenswert?

habs mir grad angeschaut... sind noch ein paar Fehler vorhanden..


1. im C-file steht 2x Höhe (für Höhe als auch Breite)

2. die Werte im C-File passen noch nicht ganz. z.B. wird für Schwarz 254 
statt 255 gesetzt.

3. damit man das Bild sofort erkennt, ob es richtig dargestellt wird, 
nicht alle Zahlen in einer Reihe schreiben, sondern pro Zeile immer nur 
die Zahlen / Pixel dieser Reihe. -> dann benötigt man gar kein Display 
etc. um sagen zu können, ob die Umwandlung erfolgreich war oder nicht.

Zum Testen ganz einfache Bilder verwenden (wie dieses hier: 
http://www.cine4home.de/tests/dvd-player/DVI-Vergleich/Graustufen.jpg).


Mein Programm funktioniert jetzt für 0, 1 und 2 Graustufen für den Epson 
controller (mehr Graustufen kann ich leider nicht darstellen auf dem 
Display).

Gruß
Bernd

von Bernd S. (mms)


Angehängte Dateien:

Lesenswert?

hier die aktuelle Version (immer noch alpha)

Bernd

von Andreas K. (ergoproxy)


Lesenswert?

Danke nochmal für das Feedback ^^ zum testen hab ich natürlich 
einfachere Bilder genommen ... Aber ich wollte halt testen obs auch mit 
sowas geht. Das mit der Höhe stimmt ^^ da hat sich ein copy/paste Fehler 
eingeschlichen und die Umwandlung ins c-File hab ich wenn ich ehrlich 
bin in 10 min geschrieben ^^ hätte auch nicht gedacht das sich da noch 
ein Fehler einmogelt. Nuja mal sehn was es für einer ist.

Gruß ErgoProxy

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.