BMP to Array



  • Hallo,
    wisst ihr wie ich in der WinAPI BMPs laden und dann in einem 2d Array laden kann, im Array muss der RGB Wert stehen...
    Danke für die Hilfe im Vorraus.



  • Im Spiele-Grafik-Forum gabs erst gestern einen Thread dazu. Wenn du aber alles über BMPs wissen willst, würd ich auf wotsit.org schauen. Das Laden in ein Array ist dann ein Kinderspiel ...

    M.T.



  • Bitmap laden: LoadImage
    RGB Werte: GetDIBits
    Tip: Die Bildzeilen enthalten am Ende Füllbytes, um die nachfolgende Zeile an DWORD Grenze auszurichten, d.h. die Zeilen sind breiter als das sichtbare Bild



  • Hi,
    Nochmal danke für die Antworten, aber ich steig da immer noch nicht durch 😕
    Im anderen Therad hab ich leider nicht gefunden was ich brauche.
    😞
    Wie wäre es mit Codeschnipsel 🙄



  • Hier ist der Code, um die BMP-Datei zu laden:

    FILE *bmp;
    bmp = fopen("C:\\bild.bmp","rb");
    
    BITMAPFILEHEADER bitmap_header; //Bitmap-Header
    BITMAPINFOHEADER bitmap_info;   //Bitmap-Info
    
    fread(&bitmap_header,sizeof(BITMAPFILEHEADER),1,bmp);
    fread(&bitmap_info,sizeof(BITMAPINFOHEADER),1,bmp);
    
    for(int y = 0; y < bitmap_info.biHeight; y++)
    {
        for(int x = 0; x < bitmap_info.biWidth; x++)
        {
            UCHAR r;
            UCHAR g;
            UCHAR b;
    
            fread(&r,sizeof(UCHAR),1,bmp);
            fread(&g,sizeof(UCHAR),1,bmp);
            fread(&b,sizeof(UCHAR),1,bmp);
    
            //Hier Daten ins Array packen ...
    
            if(x == bitmap_info.biWidth)
            {
                //Abschluss-Byte lesen
                fread(&r,1,1,bmp);
            }
        }
    }
    
    fclose bmp;
    

    M.T.



  • Laden geht ... Danke!
    Gibt es auch ne Möglichkeit Colorref Arrays über 100x100 zu deklarieren? Kompilieren geht, nur wenn ichs starte bricht das ab 😞
    Vielleicht auch nur ein anderer Fehler?
    Hier:

    bool Generate()
    {
      COLORREF array[100000][100000] = {0}; // Absturz
      FILE *bmp;
      if(bmp = fopen("C:\\bild.bmp","rb"))
      {
        BITMAPFILEHEADER bitmap_header; //Bitmap-Header
        BITMAPINFOHEADER bitmap_info;   //Bitmap-Info
        fread(&bitmap_header,sizeof(BITMAPFILEHEADER),1,bmp);
        fread(&bitmap_info,sizeof(BITMAPINFOHEADER),1,bmp);
        for(int y = 0; y < bitmap_info.biHeight; y++)
        {
          for(int x = 0; x < bitmap_info.biWidth; x++)
          {
            UCHAR r;
            UCHAR g;
            UCHAR b;
            fread(&r,sizeof(UCHAR),1,bmp);
            fread(&g,sizeof(UCHAR),1,bmp);
            fread(&b,sizeof(UCHAR),1,bmp);
          //Hier Daten ins Array packen ...
            array[x][y] = RGB(r,g,b); // Absturz
            if(x == bitmap_info.biWidth)
            {
              //Abschluss-Byte lesen
              fread(&r,1,1,bmp);
            }
          }
        }
        fclose(bmp);
      }
       return true;
    }
    

    😕



  • @Manuel
    Funzt nur mit RGB-Bildern!



  • Wie wäre es, wenn Du Deinem PC einen Speicher von 100000x100000 = 10GB RAM spendierst??



  • Hmm, wo gibts den denn? 😃
    Nein, aber ich brauche mindestens 1000x1000 und das geht nicht 😞



  • Erhöh Deinen Stackbedarf in den Linkereinstellungen



  • Projekt->Einstellungen oder wo?
    Aha, gefunden jetzt funzt es bei 1000x1000

    [ Dieser Beitrag wurde am 22.04.2003 um 13:55 Uhr von Timm editiert. ]



  • Sonst packs halt auf den Heap.



  • Danke für eure Hilfe, ich bin sehr Weit gekommen, doch stecke wieder fest 😞
    Beim schreiben in die Datei, kommen blanks oder [] sowas im hexeditor sind das 00 oder so 🙂 wisst ihr wie ich das rausfilter? sonst ist 100x100 über 19mb groß 😞

    Hier Code:

    COLORREF array[1000][1000];
    bool Generate()
    {
      LPCTSTR color;
      LPCTSTR name;
      LPTSTR temp="";
    
      BITMAPFILEHEADER bitmap_header; //Bitmap-Header
      BITMAPINFOHEADER bitmap_info;   //Bitmap-Info
    
      int nord=0;
      int sued=0;
      int ost=0;
      int west=0;
      int id =0;
      int x = 0;
      int y = 0;
      FILE *bmp;
      FILE *file;
      if(bmp = fopen("C:\\bild.bmp","rb"))
      {
        fread(&bitmap_header,sizeof(BITMAPFILEHEADER),1,bmp);
        fread(&bitmap_info,sizeof(BITMAPINFOHEADER),1,bmp);
    
        for(y = 0; y < bitmap_info.biHeight; y++)
        {
          for(x = 0; x < bitmap_info.biWidth; x++)
          {
    
            UCHAR r;
            UCHAR g;
            UCHAR b;
            fread(&r,sizeof(UCHAR),1,bmp);
            fread(&g,sizeof(UCHAR),1,bmp);
            fread(&b,sizeof(UCHAR),1,bmp);
          //Hier Daten ins Array packen ...
            array[x][y] = RGB(r,g,b);
            if(x == bitmap_info.biWidth)
            {
              //Abschluss-Byte lesen
              fread(&r,1,1,bmp);
            }
          }
        }
        fclose(bmp);
      }
      file = fopen("C:\\bild.txt","a+");
      for(y = 0; y < bitmap_info.biHeight; y++)
      {
        for(x = 0; x < bitmap_info.biWidth; x++)
        {
          if(array[x][y] != RGB(192,192,192))
          {
            //Richtungen
            if(array[x-1][y] != RGB(192,192,192))
            {
              west = 1;
            }
            if(array[x+1][y] != RGB(192,192,192))
            {
              ost = 1;
            }
            if(array[x][y+1] != RGB(192,192,192))
            {
              sued = 1;
            }
            if(array[x][y-1] != RGB(192,192,192))
            {
              nord = 1;
            }
    
            if(array[x][y] == RGB(0,255,0))
            {
              name = "Wiese";
              color = "00ff00";
            }
            else if(array[x][y] == RGB(255,0,0))
            {
              name = "Stadt";
              color = "ff1100";
            }
            else if(array[x][y] == RGB(128,128,128))
            {
              name = "Pfad";
              color = "666666";
            }
            else if(array[x][y] == RGB(255,255,0))
            {
              name = "Sand";
              color = "FFFF00";
            }
            else if(array[x][y] == RGB(0,128,0))
            {
              name = "Wald";
              color = "008800";
            }
            else if(array[x][y] == RGB(34,34,34))
            {
              name = "Gebirge";
              color = "222222";
            }
            else
            {
              name = "Nichts";
            }
    
            wsprintf(temp,"INSERT INTO map VALUES (%d, %d, %d, %d, %d, 0, 0, 0, 0, %d, %d, 0, 0, '%s', '', '%s', 0);\n",id,nord,ost,sued,west,x,y,name,color);
            fwrite(temp,sizeof(LPTSTR),strlen(temp),file);
          }
        }
      }
      fclose(file);
    
      return true;
    }
    

    [ Dieser Beitrag wurde am 23.04.2003 um 00:17 Uhr von Timm editiert. ]



  • fwrite(temp, sizeof(TCHAR), strlen(temp), file);


Anmelden zum Antworten