- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: .bmp umwandeln in c headerdatei

  1. #11
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Anzeige

    Praxistest und DIY Projekte
    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

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.08.2005
    Ort
    49.80248 8.59252
    Alter
    40
    Beiträge
    172
    Aehm, kann Gimp nicht sowas?`Muesste mich doch scherw taeuschen wenn nicht. Einfach "speichern unter" Dann dann beim Filetyp waehlen

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    33
    Beiträge
    106
    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

  4. #14
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    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

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    33
    Beiträge
    106
    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:
    Code:
    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ß:

    Code:
    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/>>(7-(x%))&1==1)
    {
    *(file2+(5-y/*84+x)|=1<<(7-(y%);
    }
    }
    }

    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/>>(7-(x%))&1==1)
    {
    *(file2+(5-y/*128+x)|=1<<(7-(y%);
    }
    }
    }

    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

  6. #16
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    habs jetzt mal angeguckt und geändert, sollte nun bei dir funktionieren, hoffe ich:
    Code:
    /*---------------------------------------------------------------- 
    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

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    33
    Beiträge
    106
    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.

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    33
    Beiträge
    106
    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.
    Code:
    /*----------------------------------------------------------------
    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.

  9. #19
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    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

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    33
    Beiträge
    106
    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

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress