Ich habe eine Textdatei, die von einer Matrixbibliothek gespeichert wird, die eine 2D-Matrix als solche enthält:
%Vor%Wo jede Zahl mit einem farbigen Pixel dargestellt wird. Ich suche nach einem Einblick, wie ich dieses Problem lösen könnte. Wenn weitere Informationen benötigt werden, zögern Sie nicht zu fragen.
EDIT: Ein anderer Ansatz, den ich ausprobiert habe, ist: fwrite(&intmatrix, size,1, bmp_ptr);
, wo ich den Matrixzeiger übergebe, der anscheinend keine lesbare BMP-Datei ausgibt. Der Wert von size
ist natürlich der rows*cols
und der Typ der Matrix ist arma::Mat<int>
, was eine Matrix aus der Armadillo Linear Algebra Library ist.
EDIT II: Lesen das zeigte meine Größe an sollte wahrscheinlich Zeilen * Spalten * 4 angesichts der Größe der Zeilen, wenn ich mich nicht irre, wäre auch eine Anleitung in diesem Punkt groß.
Hier ist eine App, die eine Textdatei mit zufälligen ganzen Zahlen erzeugt, sie zurück liest und sie als ein (ungefähr quadratisches) 32-Bit-pro-Pixel-BMP-Bild auf die Festplatte schreibt.
Beachten Sie, dass ich eine Reihe von Annahmen zu Dingen wie dem Format der ursprünglichen Textdatei, dem Nummernbereich usw. gemacht habe, diese aber im Code dokumentiert sind. Mit diesem Arbeitsbeispiel sollten Sie in der Lage sein, sie bei Bedarf einfach zu optimieren.
%Vor%Hoffe, das hilft.
Wenn Sie das richtige Bildformat wählen, ist das sehr einfach. PGM hat eine ASCII-Variante, die fast genau wie Ihre Matrix aussieht, aber mit einem Header.
%Vor% Wo P2
die Magie für ASCII PGM ist, ist die Größe 3x3 und 6 ist die maxval
. Ich wählte 6, weil das der maximale Wert war, den Sie präsentierten, was 6 Weiß ergibt (während 0 schwarz ist). In einem typischen PGM ist das 255, was mit einem 8-Bit-Graustufenbild übereinstimmt.
PPM ist fast so einfach, es hat nur 3 Farbkomponenten pro Pixel statt 1.
>Sie können mit diesen Bildern mit allem arbeiten, was PPM (netpbm, ImageMagick, GIMP, usw.) erfordert. Sie können sie als binäre PPMs speichern, die im Grunde die gleiche Größe wie ein äquivalenter BMP haben.
Um eine lesbare BMP-Datei auszugeben, müssen Sie zuerst eine Kopfzeile einfügen:
%Vor%Bevor Sie nun Ihre Farbinformationen schreiben, schreiben Sie einfach den Bitmap-Header
%Vor%Und schließlich die Farbinformation:
%Vor%Beachten Sie, dass die Blockgröße sizeof (int) ist, da Ihre Matrix keine einzelnen Zeichen, sondern ganze Zahlen für jeden Wert enthält. Abhängig vom Inhalt Ihrer Matrix ist es möglicherweise eine gute Idee, die Werte in COLORREF-Werte zu konvertieren (Überprüfen Sie das RGB-Makro, das auch in WinGDI.h zu finden ist)
Ich habe die Antwort von Ссылка umgeschrieben und kommentiert. Ich hoffe, Sie finden es klar genug.
%Vor%Haben Sie Probleme, die Matrix als Bild zu sehen oder ein Bild aus Ihrem Code zu schreiben?
Im ersten Fall tun Sie einfach, wie Ben Jackson sagte
Im letzteren Fall möchten Sie die Adresse des Datenzeigers der Arm :: Matrix übergeben und die Verwendung von fwrite setzt voraus, dass Arm :: Matrix ihre Daten als zusammenhängendes Speicherarray enthält
[Bearbeiten] Ein kurzer Blick auf Armadillo doc sagt auch, dass Daten im Spalten-Haupt-Modus gespeichert werden, aber BMP nimmt den Row-Major-Modus an, sodass Ihr Bild umgedreht aussieht.
[edit2] Mit Armadillo Matrix-Funktionen ist es noch einfacher
%Vor%