Programm zur Erzeugung einer BMP-Bilddatei

English Translation



/* Einheit zur Erzeugung von zweifarbigen BMP-Dateien durch rechnerische Abbildung/Funktion
   oder durch eine auessere Rechenvorschrift.
*/
class BMP_Erzeuger_SW //SW==SchwarzWeiss == Abkuerzung fuer zweifarbig.
{
   *char bildPuffer[];
   int gX;//Laenge einer Zeile logisch / Pixel
   int gY;//Anzahl Zeilen
   int farbe1;
   int farbe2;
   int zeilenLaenge;//Laenge einer Zeile im Abbild in Oktets
   PrintfClass pfc;
methods:
   BMP_Erzeuger_SW(int groesseX, int groesseY,int farb1, int farb2);

   void erzeugeAnfang();

   void erzeugeSinus();

   void erzeugeAusAbbildung();

   void erzeugeAusAbbildung(&String_16 abbildung,&*char bp[],&int groessePuffer);

   void zeichne(int x, int y, int color_bgr);

   void writeUI32(&int pos,int value);

   int pufferGroesse();

};

BMP_Erzeuger_SW::BMP_Erzeuger_SW(int groesseX, int groesseY,int farb1,int farb2)
{
  gX = groesseX;
  gY = groesseY;
  farbe1 = farb1;
  farbe2 = farb2;

  zeilenLaenge = groesseX / 8;
  var int m8 =   groesseX % 8;
  if( m8 > 0 )
  {
     zeilenLaenge++;
  }  
  //Aufrunden auf Wortlaenge
  var int m4 = zeilenLaenge % 4;
  zeilenLaenge = zeilenLaenge + (4-m4);
  //pfc.fstr("Zeilenlaenge $").sa(zeilenLaenge).pr();
  bildPuffer = new char [(zeilenLaenge*groesseY)+54+8];
}

void BMP_Erzeuger_SW::writeUI32(&int pos,int value)
{
    bildPuffer[pos] = cast(char,value & 0xFF);
    pos++;
    bildPuffer[pos] = cast(char,(value >> 8)  & 0xFF);
    pos++;
    bildPuffer[pos] = cast(char,(value >> 16) & 0xFF);
    pos++;
    bildPuffer[pos] = cast(char,(value >> 24) & 0xFF);
    pos++;
}

void BMP_Erzeuger_SW::zeichne(int x, int y, int FarbNr)
{
    //pfc.fstr("x: $ y: $").sa(x).sa(y).pr();

    var int stelle = (y * zeilenLaenge * 8) + x;
    var int stelleOktet = (stelle / 8) + 54 + (2*4);
    var int stelleBit = 7 - (stelle % 8); 

    var int maske = 1 << stelleBit;
    if(FarbNr != 1)
    {
       maske = 255 ^ maske;
    }

      
    bildPuffer[stelleOktet] = cast(char,cast(int,bildPuffer[stelleOktet]) ^ maske);
}

/*berechne die vollstaendige Groesse des Bildpuffers, einschliesslich Header und Farbtabelle */
int BMP_Erzeuger_SW::pufferGroesse()
{
    var int bitmap_groesse = (zeilenLaenge*gY) ;
    var int farbTabelleGroesse = 2*4;
    var int file_size = 54 + farbTabelleGroesse + bitmap_groesse;

    return file_size;
}




void BMP_Erzeuger_SW::erzeugeAnfang()
{
    var int i=0;
    var int pixel_width =  gX;
    var int pixel_height = gY;
    var int bitmap_groesse = (pixel_width*pixel_height) / 8;
    var int farbTabelleGroesse = 2*4;
    var int file_size = this.pufferGroesse();
    var int size_raw_pixel = bitmap_groesse;

    bildPuffer[i] = 'B';
    i++;
    bildPuffer[i] = 'M';
    i++;
    this.writeUI32(i,file_size);
    if( i != 6 )
    {
       pfc.fstr("assert 1 fehlgeschlagen").pr(); 
    }
    bildPuffer[i] = cast(char,0); //6
    i++;
    bildPuffer[i] = cast(char,0);
    i++;
    bildPuffer[i] = cast(char,0);
    i++;
    bildPuffer[i] = cast(char,0);
    i++;
    bildPuffer[i] = cast(char,54 + farbTabelleGroesse);//pixel offset
    i++;
    bildPuffer[i] = cast(char,0);
    i++;
    bildPuffer[i] = cast(char,0);
    i++;
    bildPuffer[i] = cast(char,0); //13
    i++;
    if( i != 14 )
    {
       pfc.fstr("assert 2 fehlgeschlagen").pr(); 
    }
    this.writeUI32(i,40); //BITMAPINFOHEADER size
    this.writeUI32(i,pixel_width);
    this.writeUI32(i,pixel_height);
    if( i != 26)
    {
       pfc.fstr("assert 3 fehlgeschlagen").pr(); 
    }
    bildPuffer[i] = cast(char,1);//number of color planess
    i++;
    bildPuffer[i] = cast(char,0);
    i++;
    bildPuffer[i] = cast(char,1);//The number of bits per pixel
    i++;
    bildPuffer[i] = cast(char,0);
    i++;
    this.writeUI32(i,0);//Disable Compression
    if( i != 34)
    {
       pfc.fstr("assert 4 fehlgeschlagen").pr(); 
    }
    this.writeUI32(i,size_raw_pixel);//Size of raw pixel data
    this.writeUI32(i,0);//horizontal resolution
    this.writeUI32(i,0);//vertical resolution
    if( i != 46)
    {
       pfc.fstr("assert 5 fehlgeschlagen").pr(); 
    }
    this.writeUI32(i,2);//The number of colors, leave at 0 to default to all colors
    this.writeUI32(i,2);//The important colors, leave at 0 to default to all colors
    if( i != 54)
    {
       pfc.fstr("assert 6 fehlgeschlagen").pr(); 
    }
    //Farbtabelle mit zwei Eintraegen
    this.writeUI32(i,farbe1);
    this.writeUI32(i,farbe2);

    for(i=54+(2*4); i < bildPuffer.sz; i++)
    {
        bildPuffer[i] = cast(char,0);
    }

}

void BMP_Erzeuger_SW::erzeugeSinus()
{
    this.erzeugeAnfang();
    var int pixel_width  = gX;
    var int pixel_height = gY;
    var int file_size = this.pufferGroesse();
    var int x;
    for(x=0; x < pixel_width; x++)
    {
        //pfc.fstr("x::$").sa(x).pr();
        var int y;
        inline_cpp[[
            y = (gY/2)+sin(float(x)/pixel_width*2.0f*3.1415f)*(gY/4);
        ]]

        this.zeichne(x,y,1);
    }

    var SPRFile file("sinus.bmp",0);
    file.write(0,file_size,bildPuffer);
    file.close();
}


Formelles, Kontakt

Impressum

Datenschutz-Erklärung