C++, Wie man erstellen Sie eine bitmap-Datei

Ich versuche herauszufinden, wie man erstellen Sie eine bitmap-Datei in C++ VS. Derzeit habe ich genommen, den Namen der Datei und das hinzufügen ".bmp" - Erweiterung um die Datei zu erstellen. Ich möchte wissen, wie könnte ich die Pixel ändern, die Datei, indem Sie es in verschiedene Farben und Muster (zB. wie ein Schachbrett) Dies ist meine Funktion, die ich habe, und ich glaube, dass ich Sie schicken 3 verschiedenen Bytes zu einer Zeit, um die Farbe des pixels.

void makeCheckerboardBMP(string fileName, int squaresize, int n) {
    ofstream ofs;
    ofs.open(fileName + ".bmp");
    writeHeader(ofs, n, n);

    for(int row = 0; row < n; row++) {
        for(int col = 0; col < n; col++) {

            if(col % 2 == 0) {
                ofs << 0;
                ofs << 0;
                ofs << 0;
            } else {
                ofs << 255;
                ofs << 255;
                ofs << 255;
            }
        }
    }
}

void writeHeader(ostream& out, int width, int height){
    if (width % 4 != 0) {
        cerr << "ERROR: There is a windows-imposed requirement on BMP that the width be a          
multiple of 4.\n";
        cerr << "Your width does not meet this requirement, hence this will fail.  You can fix     
this\n";
        cerr << "by increasing the width to a multiple of 4." << endl;
        exit(1);
    }

    BITMAPFILEHEADER tWBFH;
    tWBFH.bfType = 0x4d42;
    tWBFH.bfSize = 14 + 40 + (width*height*3);
    tWBFH.bfReserved1 = 0;
    tWBFH.bfReserved2 = 0;
    tWBFH.bfOffBits = 14 + 40;

    BITMAPINFOHEADER tW2BH;
    memset(&tW2BH,0,40);
    tW2BH.biSize = 40;
    tW2BH.biWidth = width;
    tW2BH.biHeight = height;
    tW2BH.biPlanes = 1;
    tW2BH.biBitCount = 24;
    tW2BH.biCompression = 0;

    out.write((char*)(&tWBFH),14);
    out.write((char*)(&tW2BH),40);
}
(1) Hast du den stream schließen? (2) Sie können ändern Sie die Größe durch ändern der header (es ist eine Eigenschaft in der Kopfzeile)
Wenn ein Objekt außerhalb des Gültigkeitsbereichs der Destruktor aufgerufen. ofstreams der Destruktor ruft close. Ja, der stream nicht geschlossen.
Ja ich habe den stream schließen
Auch in einigen Programmiersprachen müssen Sie schließen Sie den Bach, und ich würde nicht damit rechnen auf solche Methoden. Da Sie nicht wissen, Wann der Destruktor aufgerufen wird, kann es Jahre dauern. Und halten Sie eine Datei öffnen, ist keine gute Idee, da kann es zu Konflikten mit anderen Programmen führen, oder die OS um das Programm zu töten, wenn man zu viel Dateien öffnen. 😀
Die Frage tagged c++; den Verweis zu "einige Programmiersprachen" ist überraschend. Im code oben werden Sie do sehen, wenn der Destruktor ausgeführt wird. ofs lokal Gültigkeitsbereich; die Lebensdauer, ist leicht zu erraten. Wie für die "zu viele geöffnete Dateien" argument: Holen Sie sich ein echtes OS.

InformationsquelleAutor user2557642 | 2013-09-16

Schreibe einen Kommentar