mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik *.BMP in C einbinden?


Autor: Martinwisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Wollte mal fragen wie ich mit C am besten *.bmp Dateien einfüge. Im
Speziellen will ich einfach eine 320*200 Pixel (S/W) Datei in den
Flashspeicher mit dem restlichen programmcode schreiben. Das Bild soll
dann auf einem Display ausgegeben werden, welches soweit auch schon
läuft, nur bekomme ich die bmp Datei einfach nicht dazu mit in den
Speicher genommen zu werden.
Ich verwende einen dsPIC mit dem C30 Compiler, aber das müsste ja bei
allen Compilern ziemlich gleich sein.
Also gebt mir bitte Tipps wie ich das realisieren könnte und wie ich
dann am besten auf die Daten zugreifen kann. Vielleicht so wie auf ein
Array? Hilfe!!

Danke!
MfG Martin W

----------------------------------
http://www.sbox.tugraz.at/home/m/martinw

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am besten schreibst du dir ein kleines pc programm, dass den inhalt der
bmp datei ausliest und in ein array deiner wahl reinschreibt.
infos zum bmp format gibts bei google (bmp file format). vielleicht
solltest du die konvertierung aber lieber von einem einfacheren format
machen

Autor: Martinwisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Was einfacheres als bmp? Was wäre denn da noch einfacher als die
Rohdaten?? ;-)

Naja ein PC Programm das mir das in ein Array reinschreibt, kein
Problem... Aber was fang ich dann mit dem Array an? Ich kann es ja erst
nicht einbinden... ich mein ich könnte es all txt wieder speichern, ok
aber wie binde ich die txt datei ein und greife auf sie zu??

Danke!
MfG Martin W

----------------------------------
http://www.sbox.tugraz.at/home/m/martinw

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
" Was einfacheres als bmp? Was wäre denn da noch einfacher als die
Rohdaten?? ;-)"

Jo die Rohdaten wären einfacher als BMP und die Rohdaten könnten schon
so angepasst sein das sie das spezielle Pixelformat der LCD's direkt
unterstützen. BMP Files haben einen Header und sind somit keine
Rohdaten, auch wenn dieser Header wirklich einfach aufgebaut ist.

Gruß Hagen

Autor: Martinwisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja bitte ich mein das sind vorne ein paar Zeichen weiß jetzt nicht genau
wie viele und dann sind nurmehr die Rohdaten... Viel einfacher wirds
nicht gehen, aber der Header ist ja eh nicht das Problem...

Danke!
MfG Martin W

----------------------------------
http://www.sbox.tugraz.at/home/m/martinw

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich kann es ja erst nicht einbinden"

warum nicht? du musst das programm nur so machen, dass es dir ein
fertiges 2-dimensionales array in eine datei schreibt. die datei
bindest du dann in deine sourcen ein und fertig.
zur benutzung einfach das array durchlaufen.
da fällt mir gerad ein, du solltest auch noch x und y ausdehnung mit in
die erzeugte datei speichern

Autor: Martinwisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich soll ein C Programm schreiben, welches aus der BMP-Datei
ausliest, den Header weglöscht, und dann in ein Array die Daten
einliest. Am besten dynamisch, kann ich aber nur mit C++... Und dann
soll ich die Daten wieder einzeln auslesen und in eine Textdatei
schreiben?
Und wie binde ich die im C30 Compiler dann ein? Und wie greife ich
drauf zu? Konkretes Beispiel, ich habe sowas noch nie gemacht, nur aus
Datein ausgelesen, aber so ein µC hat ja kein Dateisystem ;-)


Danke!
MfG Martin W

----------------------------------
http://www.sbox.tugraz.at/home/m/martinw

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, wir reden noch immer aneinander vorbei :)

du machst dir eine header datei mit einem grossen array drin (ein
wirkliches array, wie es so in c halt aussieht). in dieses array
schreibst du die einzelnen bilddaten. diesen header bindest du dann in
dein uC programm ein und kannst das array ganz normal über seinen namen
ansprechen.

z.b
unsinged int[320][200] =
{ {p_11, p_12, p_13...
  {p_21, p_22....

wobei p_xx der bildpunkt an der stelle xx ist

Autor: Martinwisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh langsam schnall ichs! Also das Programm soll mir so ein Array in die
Textdatei schreiben welches dann so wie dein Beispiel aussieht. Diesen
Text kopiere ich dann in eine Headerdatei und diese binde ich mit
#include im Hauptprogramm ein. Und dann kann ich einfach drauf
zugreifen. Brauch ich wahrscheinlich noch ein extern oder sowas...
Und das ganze liegt dann auch sicher im Flashspeicher und in
effizienter Form. Also in meinem Fall unsigned char da ich immer ein
Byte an das Display senden will...

Ich glaub jetzt hab ichs kapiert! Danke!

MfG Martin W

----------------------------------
http://www.sbox.tugraz.at/home/m/martinw

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für den BASIC-Compiler FastAVR gibt es ein kostenloses Tool namens
FastLCD, das BMP-Dateien in einen hexdump konvertiert.

'/////////////////////////////////////////////////////////////////////// 
////////
bla = 128, 8,  ' Image Table Name, Xbytes, N of Lines, 1026 bytes
&h00,&h00,&h00,&h00,&h00, (....)


Den kann man sicherlich leicht in eine von einem C-Compiler verdaubare
Form bekommen.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
speicher das teil mit paint als 1 bit grafik ab. dann guckst du dir mit
nem hexeditor (oder ultra edit) das ding an und kopierst dann die
zeilen in dein array... mußt halt das ganze mit irgendwas bearbeiten um
z.B die blanks mit
", 0x" zu ersetzten.
die einzelnen zeilen kann man denke ich mal einfach auszählen und so
kannst du dann das  array dann füllen. so kannst auch sehen das der
header bis zu adresse 3d  geht (oder 61 bytes lang ist)

Autor: Martinwisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Also so weit funktioniert das! Hab nur noch ein kleines Problem mit dem
Programm, welches mir das Array erstellt. Und zwar, dass es manchmal
Zeichen auslässt. Wahrscheinlich weil es Backspace ausgibt, und dann
ein Zeichen wieder gelöscht wird...

Hier mal der Code beim Einlesen:
Bild[Spalte][Zeile] = unsigned char(Zeichen[0]);

Und beim Ausgeben:
ofs<<setfill('0')<<setw(2)<<hex<<uppercase<<unsigned
int(Bild[Spalte][Zeile] & 0xFF);

Das ganze ist natürlich ein einer Schleife etc. drinnen aber der Fehler
muss irgendwo da liegen! Vielleit weiß ja jemand wo da der Feher
passiert und wie man ihn umgehen kann!

MfG Martin W

----------------------------------
http://www.sbox.tugraz.at/home/m/martinw

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Wahrscheinlich weil es Backspace ausgibt, und dann ein Zeichen wieder
gelöscht wird..."

escapen oder als binärdatei schreiben

Autor: Martinwisi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok habs jetzt geschafft mit dem kleinen selbstgeschriebenem Programm..

Danke an alle! Beweisfoto mit meiner Freundin drauf wurde angehängt
;-)

MfG Martin W

----------------------------------
http://www.sbox.tugraz.at/home/m/martinw

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieht doch gut aus... also die quali... :)

Autor: Frank M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Menno, keiner hat ihm gesagt, daß man eins der vielen bin2hex-Tools
nehmen kann. Ich konvertiere damit gern *pbm-Dateien. Der Header ist
mehr als super einfach (X-Y-Auflösung, Farbtiefe und das wars fast
schon, siehe google) aufgebaut. paintShop kann in diesem Format s/w
speichern.

Tool gibz z.B. hier: http://www.ulrichradig.de/

Frank :-)

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.