mikrocontroller.net

Forum: Compiler & IDEs bitmap to gcc header converter


Autor: Andreas Herrmann (andy78)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


will nun endlich loslegen mit meinen Ledsee 320x240 display.


Display ist initialisiert 34 Layer nur Grafik.

kreise und linien in den Layern kann ich schon zeichnen.

nun will ich einige anzeigen Analog als bitmap erstellen und diese dann 
in den 3 Layer als bild laden.

habe mir das ganze mit corel draw gezeichnet.

Mein erstes Problem wenn ich das Bitmap auf 320x240 pixel anpasse siht 
es nicht schön aus. siehe anhang.

kann man das irendwie besser machen????


wie bekomme ich das bild in ein gcc h file so wie beim font 
generator????


Vielen Dank

Gruß

Andy

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kreise und linien in den Layern kann ich schon zeichnen.
Ein Bitmap bestehet aber nur aus Punkten.

> Mein erstes Problem wenn ich das Bitmap auf 320x240 pixel anpasse siht
> es nicht schön aus. siehe anhang.
> kann man das irendwie besser machen????
In dieser Grösse zeichnen, oder als Vektorgrafik erzeugen (z.B. mit 
Inkscape) und dann ein Bitmap erzeugen.

> wie bekomme ich das bild in ein gcc h file so wie beim font
> generator????
Da musst du dir wohl ein (einfaches) Programm schreiben und z.B. das 
Bitmap als "Bit"map speichern (z.B. hart im Code). Also ein Array mit 
320x440=140'800 Bits = 17600 Bytes, das du dann eins zu eins auf das 
Display überträgst (Farbe oder Grautönen werdens natürlich mehr).

Es sei denn du willst die Linien als Linien und die Kreise als Kreise 
Zeichnen, dann gibst du das wohl am Besten gleich so im Code ein, jede 
Figur als ein Funktionsaufruf. Hat aber nur beschränkte Vorteile.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Hat aber nur beschränkte Vorteile.
Ausser natürlich die enorme Platzeinsparung.

Autor: pinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GIMP kann als .c exportieren

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Danke

bin gerade am herunterladen von inkscape.

habe mal testhalber mit vectormagic das jpg vectorisiert und es siht 
erstaml gut aus .

werde noch mal ein bissle testen.

Vielen Dank

Gruß

Andy

Autor: Andreas Herrmann (andy78)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

also mit inkscape kann ich sehr gut arbeiten aber wenn ich exportiere 
als Bitmap (PNG) und es in ein C Header file exportiere sieht es wieder 
unscharf und unsauber im Display aus.

Ich komme infach so nicht weiter

benutze den grafikconverter von leubisoft.


Gibt es noch andere converter ????


danke

Gruß

Andy

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Bild, das du angehängt hast, ist keine Bitmap, sondern hat 
Graustufen. Wenn du die bei einer Konvertierung wieder wegmachst, dürfte 
das recht häßlich aussehen.

Autor: Andreas Herrmann (andy78)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich will eigendlich so etwas erreichen aber ich bekomme es nicht mit 
einem Bitmap hin.

Es wird wohl mir nichts anderes übrig bleiben als es im Code zu 
zeichnen.

Werde mich mal mit Bresenham beschäftigen.


gibt es irgend ein toll was mir von einen Bresenham Algo ein 
Ziffernblatt in eine Struct schreibt????


Danke

Andy

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

habe mal in paint ein paar freihand striche für das Ziffernblatt gemalt 
und die sehen auf dem Display klar und deutlich aus weil si schwarz 
sind und der hintergrund weiß.


im Inkscape ist zwar auch alles scharz weiß aber beim export werden 
graustufen draus gemacht das geht natürlich nicht.

Ich habe auch nichts gefunden womit man in incscape schwarz weiß 
exportiert.

Autor: Inkscape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Herrmann schrieb:
> im Inkscape ist zwar auch alles scharz weiß aber beim export werden
> graustufen draus gemacht das geht natürlich nicht.

Das Problem sitzt also vor dem REchner ;)

Du kannst in Inkscape einstellen, wie er die Bilder behandeln soll. 
Stell das mal auf True Color um. Frag jetzt nich wie und wo - Google ist 
dein Freund (oder eben Paint).

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ja das Problem saß vor dem rechner habe es mit Corel Draw hinbekommen.

Was ich jetz noch habe ist das ich immer nur 8 bit in x richtung den 
Coursor setzten kann.
einzelne Pixel kann ich punktgenau setzten.

hier mal der COde ist aus der SED Lib

//Berechnen der STartadresse Layer= Display Layer 1-4
void GLCD_GraphicGoTo_pix(unsigned int x, unsigned int y,unsigned int 
layer)
{
if(layer==1)GLCD_SetCursorAddress(SED1335_GRAPHICSTART1 + (y*40) + x/8);
if(layer==2)GLCD_SetCursorAddress(SED1335_GRAPHICSTART2 + (y*40) + x/8);
if(layer==3)GLCD_SetCursorAddress(SED1335_GRAPHICSTART3 + (y*40) + x/8);
}

//Coursor ADresse setzten
void GLCD_SetCursorAddress(unsigned int address)
{
GLCD_WriteCommand(SED1335_CSRW);
GLCD_WriteData((unsigned char)(address & 0xFF));
GLCD_WriteData((unsigned char)(address >> 8));
}


//Daten aus Array einlesen Fontdarstellung
void GLCD_char(char * bmp, int x, int y, int width, int height,unsigned 
int layer)
{
unsigned int i, j;
for(i = 0; i < height ; i++)
  {
  GLCD_GraphicGoTo_pix(x, y+i,layer);
  GLCD_WriteCommand(SED1335_MWRITE);
  for(j = 0; j < width/8; j++)
    GLCD_WriteData(GLCD_ReadByteFromROMMemory(bmp+j+(i*(width/8))));
  }
}


// Aufruf zum zeichnen
GLCD_char(&tanksym,5,145,16,16,1);

beginnend soll er ab x=5 machen tut er aber bei 0
wenn ich statt 5 eine 10 setzte beginnt er statt 10 bei 8 18=16 usw 
immer volle 8ten.Y richtung ist io.

irgendwass stimmt bei den adress berechnungen nicht.



//bild daten
onst prog_char tanksym[] = {


0x03, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x82, 0x01,
0x82, 0x01, 0xC2, 0x01, 0xC2, 0x01, 0x83, 0xFF,
0x83, 0xFF, 0x83, 0xFF, 0xC3, 0xFF, 0x7F, 0xFF,
0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF,
};



// hIer das Pixel stzten das geht wunderbar pixel x=5 display auch auf 5 
das gleiuche in Y richtung
void GLCD_SetPixel(unsigned int x,unsigned int y, int color,int layer)
{
unsigned char tmp = 0;
unsigned int address;
if(layer==1)address=SED1335_GRAPHICSTART1 + (40 * y) + (x/8);
if(layer==2)address=SED1335_GRAPHICSTART2 + (40 * y) + (x/8);
if(layer==3)address=SED1335_GRAPHICSTART3 + (40 * y) + (x/8);
GLCD_SetCursorAddress(address);

GLCD_WriteCommand(SED1335_MREAD);
tmp = GLCD_ReadData();

if(color)
  tmp |= (1 << (SED1335_FX - (x % 8)));
else
  tmp &= ~(1 << (SED1335_FX - (x % 8)));

GLCD_SetCursorAddress(address);
GLCD_WriteCommand(SED1335_MWRITE);
GLCD_WriteData(tmp);
}

Danke

Gruß

Andy

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Herrmann schrieb:

> Was ich jetz noch habe ist das ich immer nur 8 bit in x richtung den
> Coursor setzten kann.

Das wird wohl daran liegen, dass dein Grafik LCD so organisiert ist, 
dass jeweils 8 nebeneinander liegende Pixel zu einem Byte 
zusammengefasst sind.

Du hast ein paar Möglichkeiten

* entweder du verzischtest darauf, dass du deine Anzeige an jeder
  beliebigen Position anzeigen lassen kannst.
  Sprich: Du legst alles so aus, dass jede Bitmap immer auf einer 8-er
  Grenze beginnt

* oder du legst dir 8 Bitmaps bereit in der die Anzeige jeweils um 1
  Pixel verschoben ist

* oder du schreibst dir eine Bitmap Anzeigefunktion, die eine Bitmap
  auch um 1 Pixel verschoben anzeigen kann. Sprich, die die Bits per
  Bedarf durchrotiert, so dass sich wieder alles ausgeht

* oder du zeichnest deine Skalen per Kreisbogen und Linien-Kommandos
  Und wenn ich mir so ansehe, wie lange du da jetzt schon rumdoktorst
  wäre das nicht die schlechteste Lösung.
  Zumal da ja auch viele der Funktionen sowieso brauchst um den Zeiger
  auch noch reinzumalen.

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

habe es mit Corel draw hinbekommen der grundstock steht jetzt will ich 
eine Tabell erstellen die mir die x2,y2 koordinaten vom ursprung des 
Zeigers erstellt und per line funktion darstellt als Zeiger


x = center.x + cos(alpha) * radius;
y = center.y + sin(alpha) * radius;

ich habe pixelwerte

center.x=137
center.y=134
radius=113

werte in pixel.

alpha von 180-70 grad.


will ich die x und y bestimmen für 180 grad

rechne ich doch x=137+-1*113
x=24
y=134+0*113
y=134

habe nun die tabelle fertig in zwei arrays x und y.

übergebe nur die geschwindigkiet z.b 13kmh suche den wert an stelle 13 
im array und zeichne die linie geht supi.

Danke

Gruß

Andy

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Herrmann schrieb:

> habe nun die tabelle fertig in zwei arrays x und y.

würd ich nicht tun.
Tabelle, ja. Aber da dann die Sinus/Cosinus Werte für den Winkel.
Den Rest (ausmultiplizeren) dann im Programm.

Bei mehreren Instrumenten hast du sonst massenhaft Tabellen.
Und wenn dein Zeiger dann irgendwann nicht mehr nur ein einfacher Strich 
ist, werden deine Tabellen immer komplexer, unübersichtlicher und 
größer.

Einfach:  Sinus/Cosinuswerte

     -127 entspricht -1
     +127 entspricht +1

(dann brauchst du nur 1 Byte für Sin/Cos)

und dann einfach

  x = center.x + myCos(alpha) * radius / 127;
  y = center.y + mySin(alpha) * radius / 127;

|127| als Normierung für +-1 wird für deine kleinen Radien mehr als genug sein.

Sinus und Cosinus sind um 90° pahsenverschoben. Man kann also dieselbe 
Tabelle benutzen. Aus Symetrieüberlegungen reicht es auch aus, nur eine 
Tabelle für Winkel von 0 bis 90° anzulegen, der Rest entsteht durch 
Spiegelung bzw. Symetrien.

Du scheinst wahnsinnige Scheu davor zu haben, in deinem Programm ein 
wenig zu rechnen. Zu unrecht. µC können rasend schnell rechnen. So 
schnell kannst du nicht schauen. Im Grunde könnte man auch ganz einfach 
sin/cos in Floating Point zur Laufzeit ausrechnen und du wirst keinen 
Unterschied bemerken, solange du nicht mehr als, sagen wir mal 20 
Anzeigen auf dem Display hast.

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Werde es mal probieren die Werte im µc zu berechnen.

Ich habe im endeffekt nur ein Tacho Drehzahlmesser und Tankuhr 2x.

der rest ist Schrift + Zahlen.

Danke

Gruß

ANdy

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Herrmann schrieb:
> Hallo
>
> Werde es mal probieren die Werte im µc zu berechnen.

Probiers gleich mit Floating Point. Die Rechenzeit kannst du dir 
leisten, solange bis sich rausstellt, dass es doch nicht reicht. Aber da 
ist noch lange Zeit hin.
>
> Ich habe im endeffekt nur ein Tacho Drehzahlmesser

:-)
Dachte ich mir schon.

Wird nicht lange dauern, bis du mit dem einfachen Strich als Zeiger 
nicht mehr zufrieden bist. Wie wärs mit einer schönen Raute, die sich um 
den 0-Puntk dreht, oder einem Dreieck, das sich (natürlich jeweils 
richtig gedreht) entlang des Bogens bewegt?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So was :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.