C++: Convert text-Datei von ganzen zahlen in ein bitmap-Bild-Datei im BMP-format
Ich habe eine text-Datei gespeichert, die durch eine matrix-Bibliothek mit 2D-matrix als solche:
1 0 0
6 0 4
0 1 1
Wobei jede Zahl ist vertreten mit einem farbigen pixel. Ich bin auf der Suche nach einen Einblick, wie würde ich gehen über die Lösung des Problems. Wenn noch mehr Informationen benötigt werden, zögern Sie nicht zu Fragen.
EDIT: ein Weiterer Ansatz, den ich versucht habe ist: fwrite(&intmatrix, size,1, bmp_ptr);
wo ich den pass in der matrix Zeiger, die nicht scheinen, um die Ausgabe lesbarer BMP-Datei. Der Wert von size
ist die rows*cols
natürlich, und die Art der matrix ist arma::Mat<int>
was ist eine matrix aus dem Gürteltier Lineare Algebra-Bibliothek.
EDIT II: Lesen diese angegeben, dass meine Größe sollte wohl rows*cols*4 gegeben, die die Größe der Zeilen, wenn ich mich nicht Irre, alle Anweisungen zu diesem Punkt wäre toll.
- Ich schlage vor, Sie schauen in diesem Zusammenhang Frage: Schreiben BMP-Bild in reinem c/c++, ohne andere Bibliotheken...
- versucht, immer einige image-format-Bibliothek und Fütterung die einzelnen Pixel?
- Danke @EitanT, dieser code ist völlig un-kommentiert jedoch, und im Anschluss an die Programmierer die Logik erweist sich als mühsam. Ich arbeite meinen Weg durch, obwohl es, danke.
- Es ist mir nicht klar, was Sie haben und was Sie zu tun versuchen. Könnten Sie bitte klären Sie die Frage?
- Natürlich, im Grunde bin ich versucht, zu konvertieren, ein zweidimensionales array (oder matrix) geschrieben werden, in ein bitmap-Bild. Etwas identisch im Konzept, was getan wird hier cplusplus.com/forum/beginner/12848 aber die Werte unbedingt Lesen aus einer text-Datei.
- Lassen Sie mich wissen, wenn weitere Klärung erforderlich ist.
- Dies versuchen. fwrite(intmatrix.memptr(),size,1,bmp_ptr); die Objekte der Klasse sind in der Regel keine direkten Puffer zu den Daten, die Sie darstellen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine app, die generiert eine Textdatei, die von zufälligen Ganzzahlen, liest Sie zurück, und schreibt Sie auf die Festplatte als (etwa quadratisch) 32-bit-pro-pixel .BMP-Bild.
Hinweis, ich machte eine Reihe von Annahmen über Dinge wie das format der original-text, - Datei, die Reihe von zahlen, etc., aber Sie sind dokumentiert in den code. Mit diesem Beispiel arbeiten Sie sollten in der Lage zu zwicken Sie leicht, wenn notwendig.
Hoffe, das hilft.
Wenn Sie wählen Sie die richtige Bild-format ist dies sehr einfach. PGM hat eine ASCII-Variante, die fast genauso aussieht wie der matrix, aber mit einem header.
Wo
P2
ist die Magie für ASCII-PGM, die Größe ist 3 x 3 und 6 ist diemaxval
. Ich wählte 6, denn das war der maximale Wert, den Sie vorgestellt, welches 6 weiß (während 0 ist schwarz). In einem typischen PGM das ist 255, das entspricht einem 8-bit-Graustufen-Bild.PPM ist fast so einfach, es hat nur 3 Farbkomponenten pro pixel statt 1.
Können Sie betreiben auf diese Bilder mit etwas, das dauert PPM (netpbm, ImageMagick, GIMP, etc). Sie können speichern Sie Sie als binary PPMs, die im Grunde die gleiche Größe wie eine entsprechende BMP.
convert /tmp/foo.pgm /tmp/foo.png
für die Konvertierung in PNG.Ausgabe einer lesbaren BMP-Datei, die Sie brauchen, um einen header zuerst:
Nun, bevor Sie schreiben Ihre Farbe Informationen, schreiben Sie einfach die bitmap-header
Und schließlich die Farbe Informationen:
Beachten Sie, dass die block-Größe ist sizeof(int), wie die matrix enthält nicht einzelne Zeichen, sondern ganze zahlen für jeden Wert. Je nach Inhalt deiner matrix, es könnte eine gute Idee sein, konvertieren Sie die Werte zu COLORREF-Werte (Überprüfen Sie die RGB-makro, die gefunden werden können in der WinGDI.h, zu)
std::ifstream f("MYFILE.TXT", std::ios::in); intmatrix.load(f);
oderint x; std::ifstream f("MYFILE.TXT", std::ios::in); while(f << x) intmatrix >> x;
und die Größe der matrix, die danach mitintmatrix.reshape(2,3);
Habe ich umgeschrieben und kommentiert die Antwort von https://stackoverflow.com/a/2654860/586784. Ich hoffe, Sie finden es klar genug.
Ist problem zu sehen, die matrix als Bild oder schreiben Sie ein Bild von Ihrem code ?
Im ersten Fall, nur tun, wie Ben Jackson sagte
In späteren Fall, Sie möchten, übergeben Sie die Adresse des Daten-Zeiger des Armes::Matrix, und mit fwrite wird davon ausgegangen, dass Arm::Matrix hält seine Daten als einen zusammenhängenden Speicher-array
[Bearbeiten]
kurzer Blick auf armadillo doc auch erzählt, dass Daten in column-major-Modus, aber BMP geht davon row-major-Modus, so dass Ihr Bild Aussehen wird umgedreht
[edit2]
Mit Armadillo Matrix-Funktionen ist es noch einfacher