PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .bmp umwandeln in c headerdatei



_maddin
11.04.2007, 21:26
nabend
ich möchte auf meinem glcd (2xKS0108) mit 64x128 pixeln bitmaps anzeigen. jetzt brauche ich ein tool, mit dem man die bitmaps in eine headerdatei konvertieren kann. ich habe auf mikrocontroller.net schon etwas passendes gefunden, aber der link ist leider kaputt. kennt jemand ein tool für diese zwecke ? danke schonmal
mfg maddin

robocat
11.04.2007, 21:39
wahrscheinlich hilft dir das nicht weiter, aber ich habe mal in c etwas geschrieben, um ein S/W bitmap in ein array zu konvertieren (mit dem bitmap wird eine text-datei erzeugt, die das array enthält):
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=28736&highlight=nokia
ich kenne aber deine displays nicht, je nachdem, wie dort die bilddaten abgelegt werden, wirst du einiges umstricken müssen.

gruesse

squelver
11.04.2007, 21:50
Bringt dir das was?
http://www.fastgraph.com/help/bmp_header_format.html

Keywords bei google:
http://www.google.de/search?hl=de&q=bmp+to+header+c&btnG=Suche&meta=

_maddin
12.04.2007, 11:39
hmm dann muss ich mir wohl doch nen programm selbst schreiben.
@ robocat: ja so ein tool meine ich,bloß eben auf meine grafik controller zurecht geschnitten. leider spuckt mein compiler nur fehler aus wenn ichs einfach reinkopiere
ich hab bisher fast nur avr c programme entworfen und praktisch null erfahrung mit dem erstellen von lauffähigen pc programmen... aber das ist ja mal ne gelegenheit sich damit etwas genauer zu beschäftigen. danke für eure antworten.

aber wenn jemand noch ein funktionstüchtiges tool dafür kennt, erspart er mir damit vllt ein bisschen arbeit...

mfg maddin

robocat
12.04.2007, 12:02
mit was hast du es kompiliert? mit avr-c geht es nicht, es muss ein "richtiger" compiler sein, der executables erzeugen kann: bloodshed, mingw, gcc, bcc32 oder sowas. hier findest du eine kurzanleitung für bcc unter windows:
http://codefactory.dead-men.de/index.php?tutorial=2
das tool mit dem ich editiere und den kompiler starte ist hier beschrieben:
http://codefactory.dead-men.de/index.php?tutorial=11

ich finde es schadet nicht, wenn man weiß, wie man programme auf dem pc erzeugt. wahrscheinlich hast du mehr davon, als wenn dir jemand das fertige executable hinklatscht.
ich kann mir aber evtl. mal das datenblatt zu deinen displays angucken, und den code abwandeln und kompilieren. wäre dann ein win32 executable.

gruesse von der katz

EDIT:
kennst du diese seite http://www.compsys1.com/workbench/Benchware/Glipic/glipic.html bzw http://www.compsys1.com/support/glipic.zip?

_maddin
12.04.2007, 21:09
mit was hast du es kompiliert? mit avr-c geht es nicht, es muss ein "richtiger" compiler sein, der executables erzeugen kann:
....

für wie blöd hälst du mich ??????? ^^
ich habs mit dev-c++ compiliert. damit hab ich bisher immer meine win32 anwendungen erstellt. ist zwar eben für c++ aber da muss ja ein C programm eigt auch drauf laufen !?!

vielen dank für das angebot, ich werd erstemal gucken, ob ich das nicht selbst hinbekomme, ansonsten komme ich auf dich zurück.

die KS0108 funktionieren übrigens prinzipiell genauso wie dein nokia display, von daher müsste ich theoretisch (das heißt: wenn der compiler nicht muckt) nur die 84*48 pixel in 128*64 umwandeln, das schafft sogar ein nooby wie ich ^^ aber halt nur wenn der compiler sich nich beschwert.

_maddin
12.04.2007, 21:19
ich poste einfach mal was mein compiler sagt. vllt weißt du ja, warum es bei dir klappt und bei mir nich...

file1=malloc(size);
36 D:\Dev-Cpp\main2.cpp invalid conversion from `void*' to `unsigned char*'

file2=malloc(504);
40 D:\Dev-Cpp\main2.cpp invalid conversion from `void*' to `unsigned char*'

sprintf(buf,"unsigned char picture[]={");
63 D:\Dev-Cpp\main2.cpp initializing argument 1 of `int sprintf(char*, const char*, ...)'


von dem typ stehen da noch 5 weitere meldungen.

robocat
12.04.2007, 21:27
oh, das stimmt. malloc gibt einen void pointer zurück, den du casten musst. bcc meckert da nicht, aber streng genommen muss das so sein:
file1=(unsigned char*)malloc(size);

2ter fehler wahrscheins:
sprintf((char*)buf,"unsigned char picture[]={");

oder du deklarierst file1, file2 und buf als char* (also signed), müsste auch gehen.

gruesse

EDIT: nein, ich halte dich net für dumm, sry -.-

_maddin
12.04.2007, 21:30
np, danke für deine hilfe, ich probiers gleich mal aus

_maddin
12.04.2007, 21:54
aaaalso
ich kann jetzt eine .exe erstellen. die funktioniert auch, das ergebnis ist allerdings ein bisschen merkwürdig:


unsigned char picture[]={
4294967211,4294967211,4294967211,4294967211,429496 7211,4294967209,41,41,
41,40,40,40,40,40,40,40,
4294967210,4294967210,42,42,42,42,42,32,
4294967168,0,0,0,0,0,0,0,
87,87,87,83,83,81,81,81,
85,85,85,85,85,85,85,85,
85,85,85,85,85,84,84,64,
0,0,0,0,0,0,0,0,
4294967211,4294967211,4294967211,4294967210,429496 7202,4294967200,32,32,
43,43,42,42,42,42,42,42,
4294967210,4294967210,4294967210,4294967210,429496 7210,4294967210,4294967208,4294967200,
32,0,0,0,0,0,0,0,
87,87,87,87,87,83,83,83,
83,81,81,81,81,81,81,81,
85,85,85,85,84,84,84,64,
0,0,0,0,0,0,0,0,
4294967214,4294967210,4294967202,4294967200,429496 7200,4294967200,4294967200,0,
32,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,0,
4294967208,32,32,32,0,0,0,0,
93,93,81,81,65,64,64,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
80,80,0,0,0,0,0,0,
4294967226,4294967210,4294967210,4294967208,429496 7208,4294967168,0,0,
4294967168,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,2,
4294967200,32,32,0,0,0,0,0,
93,85,69,65,65,65,64,0,
64,0,0,0,0,0,0,0,
5,5,4,4,4,4,4,0,
81,64,64,64,0,0,0,0,
4294967250,4294967250,4294967250,4294967186,429496 7186,4294967186,4294967186,4294967184,
4294967184,16,16,16,16,16,0,0,
4294967170,4294967170,4294967170,4294967170,429496 7170,4294967170,4294967170,4294967170,
4294967208,4294967208,4294967208,4294967208,429496 7200,4294967200,4294967200,4294967200,
4294967277,4294967269,101,101,101,101,101,96,
32,32,32,0,0,0,0,0,
0,0,0,0,0,0,0,0,
85,80,80,80,80,80,80,80,
4294967250,4294967250,4294967250,4294967250,429496 7250,4294967170,4294967168,4294967168,
4294967168,0,0,0,0,0,0,0,
4294967168,4294967168,4294967168,4294967168,429496 7168,4294967168,4294967168,4294967168,
4294967208,4294967200,4294967200,4294967200,429496 7200,4294967200,4294967200,4294967200,
4294967205,4294967205,4294967205,37,37,37,37,32,
32,32,32,32,32,32,0,0,
4,4,4,4,4,4,4,4,
81,80,80,80,64,64,64,64,
4294967231,4294967231,4294967211,4294967210,429496 7210,4294967210,4294967210,4294967210,
4294967210,4294967210,4294967210,4294967208,429496 7208,4294967200,4294967200,4294967200,
4294967170,4294967170,4294967170,2,2,2,2,2,
4294967178,4294967170,2,2,2,2,2,2,
127,127,95,85,85,85,85,85,
85,85,84,80,80,80,64,64,
64,0,0,0,0,0,0,0,
85,21,21,5,5,5,5,5,
4294967231,4294967231,4294967227,4294967210,429496 7210,4294967210,4294967210,4294967210,
4294967210,4294967210,4294967210,4294967208,429496 7200,4294967200,4294967200,4294967168,
4294967168,4294967168,0,0,0,0,0,0,
42,42,10,10,10,10,10,10,
127,127,87,85,85,85,85,85,
85,84,84,80,80,64,64,64,
5,5,5,5,5,5,5,5};

eigt dürfen nur werte zwischen 0 und 255 auftreten, 4294967208 sprengt da ganz eindeutig den rahmen.

wie muss ich diese zeilen umschreiben damit sie auf mein 64x128 glcd passen ?

file2=malloc(504);
memset(file2,0,504);

for(x=0;x<84;x++)
{
for(y=0;y<48;y++)
{
if(!(*(file1+y*12+x/8 )>>(7-(x%8 )))&1==1)
{
*(file2+(5-y/8 )*84+x)|=1<<(7-(y%8 ));
}
}
}

also 84==>128 und 48==>64, denke ich mir, und der rest ???

robocat
12.04.2007, 23:48
hm, der fehler liegt nahezu sicher daran, dass eine negative zahl mit
sprintf(buf,"%u,",*(file2+i)); als unsigned geschrieben wird.

ist file2 bei dir nun als char* (also signed) deklariert? dann dürfte der fehler dort liegen.. versuch evtl mal file2 dann doch als unsigned char* zu deklarieren, sonst fällt mir grade nix ein.

weiß leider grad auf die schnelle die genaue fehlerquelle nicht, und muss nun ins bett. ich guck es mir morgen nochmal an, sobald ich dazu komme.

gruesse

kater
13.04.2007, 00:26
Aehm, kann Gimp nicht sowas?`Muesste mich doch scherw taeuschen wenn nicht. Einfach "speichern unter" Dann dann beim Filetyp waehlen

_maddin
13.04.2007, 10:31
danke robocat,
es scheint jetzt zu funktionieren. es kommen zu midest vernünftige werte dabei raus. ob auf dem display jetzt was ordentliches ankommt is ne andere frage^^

nochmals vielen dank für eure hilfe

mfg maddin

robocat
13.04.2007, 11:33
mir fällt noch ein, dass du anstelle von malloc(504) 1024 bytes reservieren musst (128*64/8 bytes), muss auch unten in der for-schleife geändert werden. wenns klappt wäre ein foto schön, wenn was nicht funktioniert, fragen.

gruesse

_maddin
13.04.2007, 16:00
ja das hab ich schon gemacht. aber egal wie es ist, das ergebnis ist nicht brauchbar. ich hab einfach mal ein komplett schwarzes bild 84x48pixel konvertieren lassen. ergebnis:


unsigned char picture[]={
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,251,123,123,123,
123,123,123,123,255,127,127,127,
127,127,127,127,255,127,63,63,
63,63,63,31,255,255,255,255,
255,255,127,127,255,255,255,255,
255,255,255,223,255,255,255,255,
255,255,255,255,255,191,191,191,
191,191,191,191,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
255,255,255,255,247,215,23,23};


und weiß:



unsigned char picture[]={
0,0,0,0,0,0,0,0,
255,255,255,255,255,255,255,255,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,255,255,255,255,
255,255,255,255,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
255,255,255,255,255,255,255,255,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,255,255,255,255,
255,255,255,255,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
255,255,255,255,255,255,255,255,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,248,120,120,120,
120,120,120,120,255,127,127,127,
127,127,127,127,248,120,56,56,
56,56,56,24,248,248,248,248,
248,248,120,120,248,248,248,248,
248,248,248,216,248,248,248,248,
248,248,248,248,248,184,184,184,
184,184,184,184,248,248,248,248,
248,248,248,248,248,248,248,248,
248,248,248,248,248,248,248,248,
248,248,248,248,240,208,16,16};



da kann was nicht stimmen.

file2=malloc(504);
memset(file2,0,504);

for(x=0;x<84;x++)
{
for(y=0;y<48;y++)
{
if(!(*(file1+y*12+x/8)>>(7-(x%8)))&1==1)
{
*(file2+(5-y/8)*84+x)|=1<<(7-(y%8));
}
}
}

diesen code abschnitt habe ich so abgeändert:

file2=malloc(1024);
memset(file2,0,1024);

for(x=0;x<128;x++)
{
for(y=0;y<64;y++)
{
if(!(*(file1+y*12+x/8)>>(7-(x%8)))&1==1)
{
*(file2+(5-y/8)*128+x)|=1<<(7-(y%8));
}
}
}

ist das richtig so ? naja das programm lässt sich so zwar compilieren, aber windoof hängt sich immer auf wenn ich das programm dann starte.

aber wenn ich nur 84x48 bilder konvertiere mit dem alten code, funktioniert es ja auch nicht, siehe oben

robocat
13.04.2007, 16:44
habs jetzt mal angeguckt und geändert, sollte nun bei dir funktionieren, hoffe ich:

/*----------------------------------------------------------------
width*height schwarz-weiss bitmap in nokia 3310 daten wandeln
compiler: bcc32
OS: XP
robocat, 13.04.07
----------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

// define glcd size here
unsigned int width=128;
unsigned int height=64;

int main()
{

FILE *pDatei;
unsigned int size,i,x,y;
unsigned char buf[64],*file1,*file2;
long pos1,pos2;

pDatei = fopen("J:\\test.bmp", "rb");

if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Quell-Datei!\n");
printf("Programm beendet.\n");
exit(1);
}

fseek(pDatei,0,SEEK_END);
pos2=ftell(pDatei);
fseek(pDatei,10,SEEK_SET);
fread(&pos1,4,1,pDatei);
fseek(pDatei,pos1,SEEK_SET);

size=pos2-pos1;
file1=malloc(size);
fread(file1,1,size,pDatei);
fclose(pDatei);

file2=(unsigned char*)malloc(width*height/8);
memset(file2,0,width*height/8);

for(x=0;x<width;x++)
{
for(y=0;y<height;y++)
{
if(!(*(file1+y*width/8+x/8)>>(7-(x%8)))&1==1)
{
*(file2+((height/8-1)-y/8)*width+x)|=1<<(7-(y%8));
}
}
}

pDatei = fopen("J:\\test.txt", "w");
if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Ziel-Datei!\n");
printf("Programm beendet.\n");
free(file1);
free(file2);
exit(1);
}
sprintf(buf,"unsigned char picture[]={");
fwrite (buf,strlen(buf),1,pDatei);
for(i=0;i<width*height/8;i++)
{
if(i%8==0)fwrite("\n",1,1,pDatei);
sprintf((char*)buf,"%u,",*(file2+i));
fwrite(buf,strlen(buf),1,pDatei);
}
fseek(pDatei,-1,SEEK_END);
fwrite ("};\n",3,1,pDatei);
fclose(pDatei);
free(file1);
free(file2);
return 0;
}

setz am besten deinen code in [code]-tags, um diese sonnenbrillen-smilies zu vermeiden.

vergiss nicht, das bmp als S/W und im richtigen format zu speichern, sonst stimmts hinten und vorn nicht.

gruesse von der katze

_maddin
13.04.2007, 17:07
ich kann jetzt einen ersten erfolg verbuchen:
auf dem display kann ich ein 48*84 bmp darstellen. das original und das ergebnis weichen allerdings voneinnander ab. (es ist mit fantasie allerdings zu erkennen, was gemeint ist.) ob das am avr code oder am konverter liegt weiß ich noch nicht so genau.

ich werde nachher mal deinen code ausprobieren.

_maddin
13.04.2007, 17:54
außer ein paar casts war dein code ok. ich hab jetzt die bilder ans display geschickt. das konvertieren hat nicht ganz geklappt, das bild ist zwei mal da aber dafür halb so groß und dem entsprechend schlecht erkennbar. aber immerhin, es kommt ein erkennbares gesicht auf dem glcd an. woran könnte das liegen ? ich hab schon height und weight vertauscht, daran liegt es nicht.


/*----------------------------------------------------------------
width*height schwarz-weiss bitmap in nokia 3310 daten wandeln
compiler: bcc32
OS: XP
robocat, 13.04.07
----------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

// define glcd size here
unsigned int width=128;
unsigned int height=64;

int main()
{

FILE *pDatei;
unsigned int size,i,x,y;
unsigned char buf[128],*file1,*file2;
long pos1,pos2;

pDatei = fopen("C:\\martin.bmp", "rb");

if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Quell-Datei!\n");
printf("Programm beendet.\n");
while(1);
}

fseek(pDatei,0,SEEK_END);
pos2=ftell(pDatei);
fseek(pDatei,10,SEEK_SET);
fread(&pos1,4,1,pDatei);
fseek(pDatei,pos1,SEEK_SET);

size=pos2-pos1;
file1=(unsigned char*)malloc(size);
fread(file1,1,size,pDatei);
fclose(pDatei);

file2=(unsigned char*)malloc(width*height/8);
memset(file2,0,width*height/8);

for(x=0;x<width;x++)
{
for(y=0;y<height;y++)
{
if(!(*(file1+y*width/8+x/8)>>(7-(x%8)))&1==1)
{
*(file2+((height/8-1)-y/8)*width+x)|=1<<(7-(y%8));
}
}
}

pDatei = fopen("C:\\martin.txt", "w");
if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Ziel-Datei!\n");
printf("Programm beendet.\n");
free(file1);
free(file2);
while(1);
}
sprintf((char*)buf,"unsigned char picture[]={");
fwrite (buf,strlen((const char*)buf),1,pDatei);
for(i=0;i<width*height/8;i++)
{
if(i%8==0)fwrite("\n",1,1,pDatei);
sprintf((char*)buf,"%u,",*(file2+i));
fwrite(buf,strlen((const char*)buf),1,pDatei);
}
fseek(pDatei,-1,SEEK_END);
fwrite ("};\n",3,1,pDatei);
fclose(pDatei);
free(file1);
free(file2);
printf("OK");
while(1);
}


das ist der code mit den richtigen casts. keine ahnung warum mein compiler da so kleinlich ist.... ^^

EDIT: ok jetzt ist der fehler mit dem doppelbild weg. (hab die bmp von 64x128 nach 128x64 gedreht). es sieht allerdings immernoch ziemlich verzerrt aus... mal sehen vllt finde ich den fehler ja noch.

robocat
13.04.2007, 20:09
ohne das display hier zu haben, kann ich leider nichts dazu sagen, ausser, dass das bmp auf meinem display auch anfangs seltsam ungenau/verfälscht ausgesehen hat. weiß aber nimmer genau worans lag.

du könntest mal das bitmap 64x128 lassen (wie zuvor) und dafür width und height im code vertauschen, wenn du das noch nicht gemacht hast.

viel erfolg wünscht die katz

_maddin
14.04.2007, 17:08
jau, wight und hight hab ich schon vertauscht, das bild ist immer noch so komisch. liegt aber nicht am avr programm sondern schon am erzeugten array. ich habs mal pixel für bixel durchgeprüft und habe schon nach wenigen zeilen einige fehler entdeckt... ich weiß nicht woran es liegt aber i.wie funktioniert die konvertierung noch nicht so ganz richtig.

mfg maddin

_maddin
15.04.2007, 09:24
hi
ich hab nach langer,langer suche ein funktionierendes tool gefunden.
(nennt sich fast lcd)
damit kann ich endlich unverzerrte bilder aufs glcd kriegen.
hab mal nen foto hochgeladen.
vielen danke für eure hilfe !!!! das ist echt ne super community hier !

mfg maddin. (das auf dem bild bin übrigens ich)

robocat
16.04.2007, 12:12
hi maddin,
es hat mir dann doch keine ruhe gelassen, deshalb hier nochmal der code, diesmal hoffentlich ohne fehler:

/*----------------------------------------------------------------
width*height schwarz-weiss bitmap in nokia 3310 daten wandeln
compiler: bcc32
OS: XP
robocat, 16.04.07
----------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#include <conio.h> // fuer getch()

// define glcd size here
unsigned int width=128;
unsigned int height=64;

int main()
{

FILE *pDatei;
unsigned int size,i,x,y,realwidth;
unsigned char buf[64],*file1,*file2;
long pos1,pos2;

realwidth=width/8;
while(realwidth%4!=0)realwidth++;

pDatei = fopen("J:\\test.bmp", "rb");

if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Quell-Datei!\n");
printf("Programm beendet.\n");
exit(1);
}

fseek(pDatei,0,SEEK_END);
pos2=ftell(pDatei);
fseek(pDatei,10,SEEK_SET);
fread(&pos1,4,1,pDatei);
fseek(pDatei,pos1,SEEK_SET);

size=pos2-pos1;
file1=malloc(size);
fread(file1,1,size,pDatei);
fclose(pDatei);

printf("size: %u (should be %u)\n",size,realwidth*height);

file2=(unsigned char*)malloc(width*height/8);
memset(file2,0,width*height/8);

for(x=0;x<width;x++)
{
for(y=0;y<height;y++)
{
if((*(file1+(y*realwidth*8+x)/8)>>(7-(x%8))&1)!=1)
{
*(file2+((height-y-1)/8)*width+x)|=1<<(7-(y%8));
}
}
}

pDatei = fopen("J:\\test.txt", "w");
if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Ziel-Datei!\n");
printf("Programm beendet.\n");
free(file1);
free(file2);
exit(1);
}
sprintf(buf,"unsigned char picture[]={");
fwrite (buf,strlen(buf),1,pDatei);
for(i=0;i<width*height/8;i++)
{
if(i%8==0)fwrite("\n",1,1,pDatei);
sprintf((char*)buf,"%u,",*(file2+i));
fwrite(buf,strlen(buf),1,pDatei);
}
fseek(pDatei,-1,SEEK_END);
fwrite ("};\n",3,1,pDatei);
fclose(pDatei);
free(file1);
free(file2);

printf("Programm erfolgreich beendet.\n");
getch();

return 0;
}

wäre toll, wenn du nochmal testen könntest, auch wenn du inzwischen eine andere lösung gefunden hast. es widerstrebt mir, hier code reinzustellen, der nicht tut was er soll.

vielleicht hat auch jmd anderes ein KS0108 und kann mal ein bitmap darauf darstellen. ich hoffe es klappt jetzt.

gruesse von der katze

_maddin
16.04.2007, 21:03
ich habe gestern ein display bei ebay erstanden, wenn das angekommen ist, werde ich deinen code natürlich testen, das alte display musste ich zurückgeben, das war nur geliehen, deshalb habe ich im mom. keine möglichkeit zum testen, sry.

mfg maddin

_maddin
19.04.2007, 14:53
nach den üblichen compiler meckereien und ein paar casts funzte dein prog. ich hab den mit deinem konverter erstellten header nem freund geschickt, der ihn auf seinem GLCD ausprobiert hat. er hat gesagt es funktioniert einwandfrei.

mfg maddin