liest den Pixelwert in der BMP-Datei

7

Wie kann ich den Farbwert von 24bit BMP-Bildern an allen Pixeln [h * w] in C oder C ++ unter Windows lesen [besser ohne 3rd Party Library]. Ich habe Dev-C ++
Ein funktionierender Code wird sehr geschätzt, da ich noch nie an Bildleseprogrammen gearbeitet habe. bin nach SO nach Googlen gekommen [wenn du besser googlen kannst als ich, plz einen Link zur Verfügung stellen].

    
Sourav 15.02.2012, 15:22
quelle

8 Antworten

36

Sie können dies versuchen:

%Vor%

Jetzt sollte data die (R, G, B) Werte der Pixel enthalten. Die Farbe von Pixel (i, j) wird in data[3 * (i * width + j)] , data[3 * (i * width + j) + 1] und data[3 * (i * width + j) + 2] gespeichert.

Im letzten Teil erfolgt der Austausch zwischen jedem ersten und dritten Pixel, weil Windows die Farbwerte als (B, G, R) Tripel speichert, nicht (R, G, B).

    
0605002 15.02.2012, 15:46
quelle
14

Code der readBMP-Funktion nach dem Auffüll-Fix:

%Vor%     
Krzysztof Kachniarz 11.06.2013 09:38
quelle
4

Hier ist eine funktionierende C ++ Version der Antwort:

%Vor%     
didil 18.07.2016 15:31
quelle
3

Ich kann die Antwort auf der obersten Ebene nicht kommentieren, weil ich noch nicht genug Stackoverflow-Reps habe, aber ich wollte nur auf einen sehr kritischen Bug mit dieser Implementierung hinweisen.

Einige Bitmaps können mit einer negativen Höhe geschrieben werden. Wenn Sie also versuchen, Ihren Bilddatenpuffer zuzuweisen, stürzt Ihr Code mit std::bad_alloc ab. Bitmaps mit negativer Höhe bedeutet, dass die Bilddaten von oben nach unten statt von oben nach unten gespeichert werden. Daher ist eine etwas bessere Version der Antwort auf der obersten Ebene (Portabilität für Systeme mit unterschiedlicher Endianität und Größe der Bytes noch nicht eingeschlossen):

%Vor%     
Owen Morgan 31.03.2017 12:26
quelle
2

Sie müssen zuerst den Bitmap-Header lesen. Nachdem Sie den Datenversatz erreicht haben, den Sie in den Bitmap-Headern finden, und die Pixel Zeile für Zeile lesen, achten Sie auf die Auffüllung im BMP-Dateiformat.

werfen Sie einen Blick auf msdn Ссылка

Ссылка

    
AlexTheo 15.02.2012 15:26
quelle
2

Ich habe eine BitMap-Klasse erstellt, die für BMP-Dateien mit 24 Bit pro Pixel funktioniert. Wenn das BMP nicht kompatibel ist, sollten Sie einen relevanten Fehler erhalten.

Es folgt fast genau mit dem Wikipedia-Artikel . (Das eine Problem ist, dass es nicht mit Dateien funktioniert, die einen Pixel-Array-Offset haben, der größer als 255 ist. Dies ist im Code vermerkt und sollte leicht reparierbar sein.)

Ich benutze das mit bmp-Dateien, die von mspaint erstellt wurden.

Hier ist eine Beispielverwendung

Beispiel.cpp

%Vor%

example_vector enthält nun die rgb (in dieser Reihenfolge) Werte des Pixels an der Koordinate (1,1), die von der Oberseite des Bildes indiziert wird und nach unten geht. Die Indizes beginnen bei 0. Siehe Wikipedia-Beispiele.

Hier ist die Header-Datei:

%Vor%     
Liam 12.01.2016 00:08
quelle
1

Eine einfache, portable Python-Lösung wird in Wie kann ich den RGB-Wert eines bestimmten Pixels in Python lesen? . Passt sich an mehrere Bildformate an, kümmert sich um das Padding und so weiter.

    
Chris Johnson 07.01.2014 04:22
quelle
-2

Ich habe die obigen Codes von didil ausprobiert und habe sie unten als Referenz zitiert (tut mir leid, und ich hatte nicht genug Reputation, um einen Kommentar abzugeben).

Der Code kompiliert OK, stürzt aber während der for-Schleife-Iteration ab. Ich denke, das hat etwas damit zu tun, dass 'ich' ein uint32_t statt int ist. Wenn 'i' Null erreicht, ist die for-Schleife immer noch gültig und 'i' wird um 3 dekrementiert, was zu einem negativen Wert wird. Da 'i' ein uint32_t ist, wird sein Wert zu einem positiven Wert und ist größer als 0. Daher wird die for-Schleife nie beendet und bewirkt, dass die Ausführung abstürzt, wenn 'i' über die Grenze des img-Speichers hinaus zeigt > %Vor%     

Habibie 19.10.2017 19:50
quelle

Tags und Links