*.BMP in C einbinden?

Gast #144205
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
Gast #144206
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
Gast #144207
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
Gast #144208
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
Gast #144210
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
Gast #144211
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
Gast #144212
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
Gast #144213
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
Gast #144214
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.
Gast #144215
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)
Gast #144216
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
Gast #144220
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren