[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: convert: uncompressed BMP with depth=1?



Hallo Christian,

On 11/01/2014 03:18 PM, Christian Schrötter wrote:
> ich versuche derzeit ein neues Bootlogo für meinen SDC Megtron LCD auf
> den internen Speicher zu laden. Dafür gibt es bei der "serdisplib" ein
> Programm namens sdcmegtron_tool:
> 
>>     -f imagefile        change bootlogo
>> (only uncompressed BMP with depth=1 and 240x128 are accepted)
> 
> Das originale Bootlogo des Herstellers (exportiert mit -l) sieht so aus:
> http://www.happytec.at/upload_files/something/sdc-megtron_original-bootlogo.bmp
> 
> 
> Das lässt sich über -f auch sofort importieren. Alle meine eigenen
> Versuche sind leider gescheitert. Ich habe mit Gimp ein einfaches Bild
> in der richtigen Auflösung erstellt, es als BMP abgespeichert und danach
> versucht mittels "convert" in das richtige Format zu bringen. Am Ende
> bin ich ungefähr bei diesem Befehl gelandet:
> 
>> convert -type bilevel -alpha off -depth 1 -colors 2 old.bmp new.bmp
> 
> Allerdings lässt es sich nicht importieren:
> 
>> # sdcmegtron_tool -f new.bmp
>> Error: common_read_simplebmp(): no valid BMP file
> 
> "identify -verbose" zeigte keine besonderen Unterschiede zwischen dem
> Original und meiner Version. Welche Parameter muss ich convert mit auf
> den Weg geben, damit mein eigenes Bild das korrekte Format hat und es
> von sdcmegtron_tool akzeptiert wird? Eventuell wird auch jemand aus den
> betreffenden Codezeilen der common.c schlau, wo der Header der BMP-Datei
> überprüft und zurückgewiesen wird:
> 
> * http://www.happytec.at/upload_files/something/sdcmegtron_tool.c
> * http://www.happytec.at/upload_files/something/common.h
> * http://www.happytec.at/upload_files/something/common.c

Wenn man sich den Hexdump des Original-Bildes anschaut, sieht das so aus:

$ xxd sdc-megtron_original-bootlogo.bmp | head
0000000: 424d 3e0f 0000 0000 0000 3e00 0000 2800  BM>.......>...(.
0000010: 0000 f000 0000 8000 0000 0100 0100 0000  ................
0000020: 0000 000f 0000 130b 0000 130b 0000 0200  ................
0000030: 0000 0200 0000 ffff ff00 0000 0000 0000  ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000060: 0000 0000 0000 0000 0000 0000 1000 0400  ................
0000070: 0000 0080 0002 0000 0000 0000 0000 0000  ................
0000080: 0000 0000 0000 0000 0000 0000 1000 0200  ................
0000090: 0000 0080 0001 0000 0000 0000 0000 0000  ................

Der Fehler "no valid BMP file" passiert, wenn:

 - die ersten zwei Byte != (0x42, 0x4d) sind; oder
 - der Wert an Offset 0xa als little endian interpretiert (oben:
   0x0000003e = 62) größer als 74 oder kleiner als 54 ist.

Ich vermute bei Dir ist er größer als 74, richtig?

Weiter habe ich jetzt nicht recherchiert, aber ich vermute, diesen Wert
hast Du mit Imagemagick nicht im Griff und musst ein anderes Programm
finden (zur Not einen Hexeditor). Alternativ die (künstliche)
Beschränkung mit der 74 im Programm wegprogrammieren. Dafür müsste man
einfach statt:

	rc = fread(imgbuffer, 1, offset - sizeof(bmpheader), f);
	if (rc != (offset - sizeof(bmpheader)) ) {

folgendes machen:

	rc = fseek(f, offset, SEEK_SET);
	if (rc != offset) {

und natürlich oben den Test auf:

	((offset - sizeof(bmpheader)) > 20)

löschen.

Liebe Grüße
Uwe


Reply to: