Bitmap erzeugen mit C++

Was ist outfile? Wenn du eine Datei schreiben willst, musst du da einen std::eek:fstream benutzen:

std::eek:fstream outfile( "filename", ios_base::eek:ut | ios_base::binary );
 
Das hab ich ja auch im Hauptprogramm, das diese Funktion benutzt, oder hab ich da was falsch verstanden? Hier der gesamte Code:
C++:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;

void ausgabe(unsigned int zahl);
void ausgabekurz(unsigned int zahl);

int main()
{
    cout<<"Hoehe:";
    unsigned höhe, größe;
    cin>>höhe;
    ofstream outfile("pascal.bmp", ios::out | ios::binary);
    outfile.write("BM",2);
    switch(höhe%4)
    {
    case 0: größe=höhe*((2*höhe+2)*3+2)+54; break;
    case 1: größe=höhe*((2*höhe+2)*3+0)+54; break;
    case 2: größe=höhe*((2*höhe+2)*3+2)+54; break;
    case 3: größe=höhe*((2*höhe+2)*3+0)+54; break;
    }
    ausgabe(größe);
    ausgabe(0);
    ausgabe(54);
    ausgabe(40);
    ausgabe(höhe*2+2);
    ausgabe(höhe);
    ausgabekurz(1);
    ausgabekurz(24);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    unsigned short **pascal = new unsigned short *[höhe*2+2];
    for (unsigned i = 0; i < höhe*2+2; ++i) pascal[i] = new unsigned short[höhe];
    pascal[0][0]=1;
    for(unsigned short x=0; x<höhe*2+2;x++)
        for(unsigned short y=0; y<höhe; y++)
            pascal[x][y]=0;
    unsigned char end=255;
    unsigned short x,y;
    pascal[höhe][höhe-1]=pascal[höhe+1][höhe-1]=1;
    for(x=1; x<=höhe*2; x++)
        for(y=höhe-2; y>0; y--)
            pascal[x][y]=(pascal[x+1][y+1]+pascal[x-1][y+1])%2;
    for(y=0; y<=höhe-1; y++)
    {
        for(x=0; x<=höhe*2+1; x++)
        {
            switch(pascal[x][y])
            {
                case 1:
                    outfile.put(0);
                    outfile.put(0);
                    outfile.put(end);
                    break;
                case 0:
                    if(x+y<=2048&&x-1<=y)
                    {
                        outfile.put(0);
                        outfile.put(end);
                        outfile.put(end);
                    }
                    else
                    {
                        outfile.put(end);
                        outfile.put(end);
                        outfile.put(end);
                    }
                    break;
            }
        }
        outfile.put(0);
        outfile.put(0);
    }

    for (unsigned i = 0; i < höhe*2+2; ++i) delete[] pascal[i];
    delete[] pascal; 
    outfile.close();
    return 0;
}

void ausgabe(unsigned zahl)
{
    unsigned s1, s256, s65536, s16777216;
    s1=zahl%256;
    zahl/=256;
    s256=zahl%256;
    zahl/=256;
    s65536=zahl%256;
    zahl/=256;
    s16777216=zahl%256;
    outfile.put(s1);
    outfile.put(s256);
    outfile.put(s65536);
    outfile.put(s16777216);
}

void ausgabekurz(unsigned zahl)
{
    unsigned s1, s256;
    s1=zahl%256;
    zahl/=256;
    s256=zahl%256;
    outfile.put(s1);
    outfile.put(s256);
}
 
Ach so: Du hast dein outfile innerhalb von main deklariert. Darauf können die Funktionen nicht zugreifen. Du musst das outfile ausserhalb von main deklarieren (oder als Parameter übergeben).

Zusätzliche Anmerkungen, mein VS 2003 spuckt mir eine Menge Fehler und Warnungen bei deinem Code aus:

1) Variablennamen niemals mit Umlauten (ö,ß)
2) pascal ist ein definiertes Schlüsselwort (zumindest bei VS), nimm hier besser einen anderen Namen
3) Ich bekomme eine Menge Warnungen bezüglich der x,y Variablen in den for-Schleifen. Diese am besten direkt immer in den for-Schleifen deklarieren. Der Compiler meckert zum Bsp. in Zeile 46, dass er nicht genau weiss, welches der beiden x er verwenden soll (Dass von der ersten for-Schleife oder das direkt davor deklarierte).

Ich kriege danach aber ein lustiges BMP mit gelben Dreieck links und roter Linie rechts :)


Edit: Herrgott, seit der Umstellung ruckelt die Seite wie Sau und man kann den Code nicht mehr aus der Anzeige kopieren ohne dass die Zeilenumbrüche flöten gehen.
 
Also, ich habs jetzt soweit, noch die Farben ein bisschen geändert, dann mal ausprobiert und für Höhe 8192 eingegeben. Das hatte zur Folge, dass mein Rechner nicht mehr ganz wusste, was er jetzt mit dieser 284MB großen Bitmap tun sollte, weil ich sie gleichzeitig geöffnet, unter anderem Namen gespeichert und als Desktophintergrund ausgewählt habe;). Naja, jetzt funktioniert er wieder, nachdem ich einfach den Aus-Knopf gedrückt habe. Das ist der Code:
C++:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;

void ausgabe(unsigned int zahl);
void ausgabekurz(unsigned int zahl);

std::ofstream outfile("pasc.bmp", ios_base::out | ios_base::binary);

int main()
{
    cout<<"Hoehe(Bitte nur gerade Zahl):";
    unsigned hoehe, groesse;
    cin>>hoehe;
    hoehe+=1;
    outfile.write("BM",2);
    switch(hoehe%2)
    {
    case 0: groesse=hoehe*((2*hoehe+2)*3+2)+54; break;
    case 1: groesse=hoehe*((2*hoehe+2)*3)+54; break;
    }
    ausgabe(groesse);
    ausgabe(0);
    ausgabe(54);
    ausgabe(40);
    ausgabe(hoehe*2+2);
    ausgabe(hoehe);
    ausgabekurz(1);
    ausgabekurz(24);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    ausgabe(0);
    unsigned short **pasc = new unsigned short *[hoehe*2+2];
    for (unsigned i = 0; i < hoehe*2+2; ++i)
        pasc[i] = new unsigned short[hoehe];
    for(unsigned short x=0; x<hoehe*2+2;x++)
        for(unsigned short y=0; y<hoehe; y++)
            pasc[x][y]=0;
    pasc[hoehe][hoehe]=pasc[hoehe+1][hoehe]=1;
    for(unsigned y=hoehe-1; y>0; y--)
        for(unsigned x=1; x<=hoehe*2; x++)
            pasc[x][y]=(pasc[x+1][y+1]+pasc[x-1][y+1])%2;
    unsigned char a150=150;
    for(unsigned y=1; y<=hoehe; y++)
    {
        for(unsigned x=0; x<=hoehe*2+1; x++)
        {
            switch(pasc[x][y])
            {
            case 1://Muster
                outfile.put(125);
                outfile.put(a150);
                outfile.put(0);
                break;
            case 0://Dreiecke
                if(x+y<=hoehe*2&&x-1>y&&x>0)
                {
                    outfile.put(a150);
                    outfile.put(125);
                    outfile.put(0);
                }
                else//Hintergrund
                {
                    outfile.put(a150);
                    outfile.put(100);
                    outfile.put(0);
                }
            }
        }
        switch(hoehe/2)
        {
        case 0:
            outfile.put(0);
            outfile.put(0);
            break;
        case 1:
            break;
        }
    }

    for (unsigned i = 0; i < hoehe*2+2; ++i) delete[] pasc[i];
    delete[] pasc; 
    outfile.close();
    return 0;
}

void ausgabe(unsigned zahl)
{
    unsigned s1, s256, s65536, s16777216;
    s1=zahl%256;
    zahl/=256;
    s256=zahl%256;
    zahl/=256;
    s65536=zahl%256;
    zahl/=256;
    s16777216=zahl%256;
    outfile.put(s1);
    outfile.put(s256);
    outfile.put(s65536);
    outfile.put(s16777216);
}

void ausgabekurz(unsigned zahl)
{
    unsigned s1, s256;
    s1=zahl%256;
    zahl/=256;
    s256=zahl%256;
    outfile.put(s1);
    outfile.put(s256);
}
und hier kommt das Programm(ich rate dir, nicht zu hohe Zahlen einzugeben, also 1024 geht noch, aber dann hab ich mich zu weit gewagt;))
 

Anhänge

  • pascal.zip
    4,2 KB · Aufrufe: 40
Irgendwie haben mir die Farben noch nicht gefallen, hier kommt die neue Version.
Kann man beim Ändern keine Dateien anhängen?, das habe ich nämlich hier vergessen, deshalb kommt das Programm im nächsten Post.
SCHEI*E
 
Zuletzt bearbeitet:
Zurück