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.
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
Wenn ein Objekt außerhalb des Gültigkeitsbereichs der Destruktor aufgerufen.
ofstream
s 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
writeHeader
richtig umgesetzt ist dies fast korrekt. Sie benötigen, um fix 2 Fragen aber:int
pro Farbkanal. Dies sollte ein byte statt. Sie müssen gegossen, die die Literaleunsigned char
.DWORD
ausgerichtet. Nach Ihrem inneren Schleife übercol
Sie schreiben müssen zusätzliche bytes, um dies zu berücksichtigen, es sei denn, die Größe in bytes der Zeile ist ein Vielfaches von vier.InformationsquelleAutor IInspectable
Diese sind die zwei Funktionen, die ich benutze für meinen code (eine Graustufen -, RGB-speichern).
Könnte einen Hinweis darauf geben, was schief läuft.
Hinweis: Sie werden durchgeführt, um zu arbeiten, nicht effizient zu sein.
biSizeImage
nicht scanline-Polsterung berücksichtigt. Für unkomprimierte RGB-Bilder, das ist das beste auf 0 gesetzt trotzdem. Ihre BerechnungbfOffBits
nicht für den account alignment-Anforderungen. Verwendenoffsetof(BITMAPINFO, bmiColors[256])
statt. Sie sind dumping wirklich zufällige bytes (empty
). Es gibt mehr Probleme, und es zeigt sich mal wieder: Don ' T roll your own. Verwenden Sie die Windows Imaging Component - ist es da für einen Grund.InformationsquelleAutor SinisterMJ
Müssen Sie zu zwingen, die Ausgabe geschrieben werden binäre - format, nicht im text, ist diese gewählt, wenn Sie die Datei öffnen/erstellen Sie Ihre Strom und die Ausgabe aller Werte als bytes, nicht ganze zahlen, diese kann getan werden, in eine Reihe von Möglichkeiten wahrscheinlich das einfachste sein schreiben
chr(0)
oderchr(255)
- Sie müssen auch anfangen, Ihre Datei mit einem header-Abschnitt, gibt es eine Reihe von Formaten, um diese zu lange zu gehen (in einer Antwort hier - einige von Ihnen sind unten zu bevorzugen, so viel wie nichts. Es ist eine gute Zusammenfassung in Wikipedia.Im Grunde hat er die Entgegennahme der Anträge, welches format Sie verwenden, die Anzahl der Zeilen, Spalten und wie die Farben gespeichert werden.
InformationsquelleAutor Steve Barnes