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].
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).
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):
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%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.
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%