bmp bild einfügen

Hallo zusammen,

ich verzweifele hier gerade.

Ich möchte einfach nur ein Bild von einer SD Karte lesen und dann anzeigen.

An der folgenden Zeile hängt er sich auf:

[/
prog_uint16_t auto[76800] PROGMEM={code]

--> expected identifier or '(' before '[' token

Hat jemand einen Rat für mich?

Abgesehen von der vermurksten Syntax hat das nichts mit SD zu tun. Damit speicherst du ein Array im Flash Speicher des Controllers!

Das geht übrigens bei der Größe nicht so einfach. Bei 2 * 76800 Bytes überschreitet man die 128k Grenze. Schon >64k kann man Daten nicht mehr mit einfachen 16-Bit Zeigern adressieren, sondern muss etwas mehr Aufwand betreiben (Stichwort. Far Pointer). Außerdem muss man die Daten in kleinere Pakete aufteilen und die Sektionen genau festlegen.

Um ein Bild auf SD zu speichern, musst du die Binärdaten in einer Datei abspeichern. Dann öffnest du die Datei und liest Byte-Weise aus.

EDIT:
Ich nehme mal an hier geht es wieder um dein TFT Display. Dann geht es doch im Flash Speicher.

Aber das geht auch keinen Fall mit so großen Bildern. Du musst unter 64k bleiben.

Schau dir dazu mal die Sourcen der Bitmap Beispiele an. Da sind .c Dateien in dem Order wo die Arrays definiert sind.

const unsigned short icon[0x400] PROGMEM ={
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xCE79, 0xBDD7, 0xAD75,   // 0x0010 (16)
....
....
};

Aber selbst das 128*128 Pixel Beispiel hat nur 0x1000 * 2 = 8kB!

Sag uns mal wozu Du das machen willst?
Grüße Uwe

Auf der UTFT Seite gibt es übrigens einen Bild Converter
http://henningkarlsen.com/electronics/t_imageconverter565.php

Aber du musst dich wie gesagt bei der Größe beschränken!

Das ist wie gesagt um das Bild beim Programmieren im Flash des Controllers abzuspeichern. Nicht auf SD. Das auf SD zu machen wäre auch viel langsamer.

für eine Anwendung möchte ich einfach ein Hintergrundbild haben.
ich habe genau diesen Konverter benutzt. das Bild hat 8 KB und der bläht es mir auf sagenhafte 731 KB auf und erzeugt o.g Quelltext- Zeile

Du musst das Ausgangsbild vorher auf die korrekte Anzahl an Pixeln zurechtstutzen. Bei komprimierten Bildern wie .jpg ist das eine wichtigere Metrik als die Dateigröße!

Ich habe es mal mit einem 320*200 Bild gemacht. Ergebnis:

prog_uint16_t test[64000] PROGMEM={

Die Datei stimmt so weit, aber die Größe ist schon grenzwertig, da am Anfang des Flashs noch eine paar Dinge wie die Interrupt-Vektor Tabelle und die Trampolins kommen. Bei mir fängt der PROGMEM Bereich bei ca. Adresse 488 an. Könnte also vielleicht gerade noch gehen.

Quatsch! Das Array ist doppelt so groß wie es sein darf. Das sind 64000 * 2 Bytes. Sorry. Geht also nicht mit Bildern die den ganzen Bereich ausfüllen. Das Array darf maximal ca. 32000 Werte haben.

Probier aber für den Anfang erst mal ein kleines Bild. Dann kannst du was größeres ausprobieren. Maximal dürften so 200*160 gehen. Das sind genau 32000 Pixel.

Und die 64k beziehen sich auf die Größe des Arrays in Bytes!! Nicht auf die Größe der Datei die da rauskommt. Die ist natürlich größer, da das eine Text Datei ist.

dr_jack:
für eine Anwendung möchte ich einfach ein Hintergrundbild haben.
ich habe genau diesen Konverter benutzt. das Bild hat 8 KB und der bläht es mir auf sagenhafte 731 KB auf und erzeugt o.g Quelltext- Zeile

Hintergrundbild für was?
Display, Webseite ???
Grüße Uwe

Es geht um ein normales 3,2" TFT Display mit der UTFT Lib.

Mir wurde das klar weil ich noch sein anderes Thread wegen dem Display in Erinnerung gehabt habe:
http://forum.arduino.cc/index.php?topic=258679.msg1827822#msg1827822
Außerdem deutet auch der Code Schnippsel sehr deutlich darauf hin.

Die UTFT Library hat eine Methode mit der man Bilder die im Flash abgespeichert wurden ausgeben kann. Aber halt nur 32k Pixel groß. Dazu lässt man das Bild durch diesen Konverter laufen, packt die Datei in den Sketch Ordern und deklariert das Array dann als "extern". Praktisch so wie Font Dateien auch.

Hey es funktioniert :slight_smile:
Im Prinzip möchte ich einen Ultraschallsensor im Auto verbauen und
dann, wenn das RF Signal kommt, ein Menü aufrufen, welches VW-Like
das Auto als Hintergrund hat. Hier sollen dann die Abstände bildlich dargestellt werden.

Vielen Dank für die Hilfe!
Hat der Anfänger wieder was gelernt :wink:

Du kannst die Bilder übrigens Skalieren. drawBitmap() hat einen optionalen Parameter am Ende für einen Faktor:

drawBitmap(x, y, sx, sy, data[, scale]);

scale:

Scaling factor. Each pixel in the bitmap will be drawn as x pixels on screen.

Das wird im UTFT_Bitmap Beispiel demonstriert. Das verpixelt natürlich entsprechend.