C ++: Textdatei von Integer in eine Bitmap-Bilddatei im BMP-Format konvertieren

7

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ß.

    
Louis93 30.08.2012, 15:18
quelle

5 Antworten

12

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.

    
U007D 03.09.2012, 05:58
quelle
6

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.

    
Ben Jackson 05.09.2012 01:01
quelle
5

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)

    
Mark 01.09.2012 15:38
quelle
1

Ich habe die Antwort von Ссылка umgeschrieben und kommentiert. Ich hoffe, Sie finden es klar genug.

%Vor%     
Realz Slaw 07.09.2012 19:03
quelle
0

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%     
remi 07.09.2012 14:55
quelle

Tags und Links