Bitmap-Datei-Werte lesen



  • Kennt Ihr eine gute, kompakte Bibliothek, mit der man die Werte aus einer Bitmapdatei auslesen kann?
    Also Breite, Höhe, einzelne Pixelfarbwerte an der angegebenen x- und y-Position etc.

    Am besten wirklich eine einzelne Header- und C- oder CPP-Datei, die man mal eben ins eigene Programm einbinden kann.
    Nicht so ein Monster wie SDL, wo man erstmal den Pfad angeben, die Libdatei einbinden und ne DLL zur Exe hinpacken muss.

    Ne simple Klasse (oder im Fall von C: Funktionssammlung) eben, die einfach alle möglichen Attribute einer Bitmap auslesen kann.
    (JPG, PNG etc. nicht nötig. Nur simple Standard-BMPs, wie man sie seit Urzeiten mit MS paint erstellt.)

    Aber schon vernünftig geschrieben, dass es auch immer korrekt funktioniert. Nicht irgendwas mal eben schnell Runtergefrickeltes, wo dieses nicht geht und man hier aufpassen muss und da noch ein Bug drin ist und so weiter.



  • Nein, so etwas gibt es nicht und wird es nie geben.



  • Klein, komplett, bugfrei und Unterstützung für nur BMPs sind schon mal Widersprüche, die eine Suche wohl unmöglich machen.

    Selbst ein so einfaches Format bietet durch Top/Down - Bottom/Up, Farbtabellen für Bittiefen < 24, Alignment der Rasterzeilen etc. einige Fallstricke.
    Auf der anderen Seite werden sich Lösungen, die all das berücksichtigen, nicht nur auf dieses eine Format beschränken.

    Nur für Windows kannst du aber GDI+ nehmen, das ab XP generell verfügbar ist und eine C++-Schnittstelle bietet. Leider ist der direkte Pixelzugriff nicht sonderlich optimiert - für echte Bildbearbeitung ist es nicht unbedingt empfehlenswert.



  • mal easybmp angesehen?



  • manni66 schrieb:

    Nein, so etwas gibt es nicht und wird es nie geben.

    Aha. 🙄

    dref schrieb:

    Klein, komplett, bugfrei und Unterstützung für nur BMPs sind schon mal Widersprüche, die eine Suche wohl unmöglich machen.

    Wieso sind das Widersprüche?

    "Eine Bibliothek für Bitmaps muss Bugs beinhalten", oder wie?

    manni66 schrieb:

    Nur für Windows kannst du aber GDI+ nehmen

    Wenn ich etwas nur für Windows wollte, könnte ich weiterhin HBITMAP und HDC nehmen. Wozu hier die Empfehlung von GDI+?

    zufallswert schrieb:

    mal easybmp angesehen?

    Könnte vielleicht tatsächlich was sein.



  • Welcher Depp hat denn dieses EasyBMP geschrieben?

    ZeroWORD: Unreferenzierte lokale Variable.

    Und die Parameter für GetPixel heißen i und j. Das muss man sich mal vor Augen führen: i und j für die Pixelkoordinatenangaben in einer Bitmap.



  • Das da scheint ganz gut zu sein:
    www.partow.net/programming/bitmap/index.html

    Zwar nur für 24 Bit, aber ansonsten OK.



  • Wenn dir 24-bit-Unterstützung reicht, dann weiß ich nicht, warum du noch lange suchst. Das ist in unter 5 Minuten selbst implementiert. Eine BMP-Datei besteht aus einem simplen Header und einem Datenblock, einfacher geht es nicht. Kompliziert wird es erst, wenn man Paletten, custom bitmasks und RLE unterstützen will.

    Spoiler: nicht mal GDI oder GDI+ unterstützt bitmasks und damit auch nicht die Windows-Bildvorschau und auch sonst habe ich außer MS Paint kein Bildbearbeitungsprogramm gefunden, welche solche BMP-Dateien korrekt anzeigen konnte. Man kann auf das Feature also offenbar getrost verzichten.



  • Eine Datei - alles dabei: https://github.com/nothings/stb/blob/master/stb_image.h

    #define STB_IMAGE_IMPLEMENTATION // nur einmal nötig!
    #include "stb_image.h"
    
    int textureWidth = 0;
    int textureHeight = 0;
    int components = 0;
    
    // Pixelwerte laden (Bytearray)
    unsigned char *image = stbi_load(fileName.c_str(), &textureWidth, &textureHeight, &components, 0);
    
    ...
    ...
    
    stbi_image_free(image);
    


  • Claus Smal schrieb:

    Welcher Depp hat denn dieses EasyBMP geschrieben?

    ZeroWORD: Unreferenzierte lokale Variable.

    Und die Parameter für GetPixel heißen i und j. Das muss man sich mal vor Augen führen: i und j für die Pixelkoordinatenangaben in einer Bitmap.

    Eine harmlose Warnung und eine Namenswahl für Parameter? Echt jetzt? Wenn das deine Kriterien sind um jemanden bereits als "Deppen" zu bezeichnen, dann kannst du noch nicht viel Quellcode zu Gesicht bekommen haben.
    btw: i,j-Koordinaten finde ich als jemand der selbst viel Bildverarbeitung macht nicht wirklich ungewöhnlich. Schliesslich ist ein Bild auch nur eine Matrix aus Farbraumvektoren.



  • Finnegan schrieb:

    Eine harmlose Warnung und eine Namenswahl für Parameter? Echt jetzt? Wenn das deine Kriterien sind um jemanden bereits als "Deppen" zu bezeichnen, dann kannst du noch nicht viel Quellcode zu Gesicht bekommen haben.

    Es geht darum, dass man an solchen kleinen Sachen schon die Schlamperiche erkennt: Wieso hat der diese eine Variable denn nicht weggemacht, bevor er seinen Code veröffentlicht hat? Wenn er schon bei solchen Sachen schludert, was ist dann erst vom Rest zu erwarten?

    Ja, es ist nur eine Kleinigkeit, aber genau darum geht es ja: Er schafft es nicht mal, harmlose Kleinigkeiten zu entfernen. Und das in Bibliotheken, die er ins Internet stellt. Ich kenne solche Leute. Die schludern.

    Finnegan schrieb:

    btw: i,j-Koordinaten finde ich als jemand der selbst viel Bildverarbeitung macht nicht wirklich ungewöhnlich. Schliesslich ist ein Bild auch nur eine Matrix aus Farbraumvektoren.

    Eine Bitmap ist ein zweidimensionales Bild, bestehend aus Pixeln. Und bei sowas gibt man die Position mit x und y an, da gibt's doch gar nichts zu diskutieren.

    Außer man ist ein Schlamper, der wahrscheinlich zu faul war, selbst so kleine Parameter auszuschreiben und deshalb die Variablen per Copy & Paste von irgendwelchen Laufvariablen genommen hat, die er gerade irgendwo rumliegen hatte.



  • Eigentlich dürfte man nicht mehr helfen, denn wenn alles so klar ist, fragt man sich, warum machst Du es dann nicht selbst.

    Aber hihi^^, habe so was nämlich selbst schon gemacht, allerdings nur mit der Farbtabelle, das Dateiformat kann man bei wikipedia nachschauen.

    Dann kommt da sowas bei raus:

    _File: WOLKEN.bmp
    
    _Kopf_
    
    #0   bfType             42 4d           19778
    #2   bfSize             4d 36 40 02    147510
    #6   bfReserved         36 40 02 00         0
    #10  bfOffbits          40 02 00 00      1078
    
    _Eigenschaften_
    
    #14  biSize             42 4d 36 40        40
    #18  biWidth            4d 36 40 02       416
    #22  biHeight           36 40 02 00       352
    #26  biPlanes           40 02               1
    #28  biBitCount         02 00               8
    #30  biCompression      00 00 00 00         0
    #34  biSizeImage        00 00 00 00    146432
    #38  biXPelsPerMeter    00 00 00 36     11810
    #42  biYPelsPerMeter    00 00 36 04     11810
    #46  biClrUsed          00 36 04 00       256
    #50  biClrImportant     36 04 00 00       256
    
    _Farbtabelle_      Size: 256
    
            B  G  R             B    G    R
    
    #54    00 00 00 00          0    0    0 
    #58    00 31 ad 00          0   49  173 
    #62    10 31 ad 00         16   49  173 
    #66    00 31 bd 00          0   49  189 
    #70    18 39 ad 00         24   57  173 
    #74    00 42 b5 00          0   66  181 
    #78    b5 6b 29 00        181  107   41 
    #82    29 42 ad 00         41   66  173 
    #86    08 4a b5 00          8   74  181 
    #90    a5 73 29 00        165  115   41 
    ...
    ...
    

    Die Bildposition selbst ist aber nicht enthalten. Die musst Du woanders auslesen?



  • PS: Falls sich jemand fragen sollte, warum die Farbtabelle gleich nach den Eigenschaften kommt? Dazwischen sind nur eventuelle Farbmasken wenn biCompression einen bestimmten Wert hat, und dazu bedeutet alle Werte ungleich 0 diese Bilddaten sind kodiert.

    Dies ist mir bei meinem aktuellen Stand zu kompliziert, außerdem benötige ich eigentlich nur die Farbtabelle.

    // Farbmasken  //wird zur Zeit erstmal abgebrochen
        int biCompression = info.data.at(5);
        if (biCompression != 0)
        {
            file << '\n'
                 << "biCompression = " << biCompression << '\n'
                 << "Bilddaten sind kodiert\nkann im Moment nicht verarbeitet werden" << '\n';
            file.close();
        }
    

    edit: hatte gerade kein Bild mit Farbmasken gefunden



  • Claus Smal schrieb:

    Finnegan schrieb:

    btw: i,j-Koordinaten finde ich als jemand der selbst viel Bildverarbeitung macht nicht wirklich ungewöhnlich. Schliesslich ist ein Bild auch nur eine Matrix aus Farbraumvektoren.

    Eine Bitmap ist ein zweidimensionales Bild, bestehend aus Pixeln. Und bei sowas gibt man die Position mit x und y an, da gibt's doch gar nichts zu diskutieren.

    Unsinn, wenn man aus der linearen Algebra kommt passt i,j schon. x,y für diskrete Indizes finde ich verwirrend, da man dahinter Gleitkommazahlen vermutet. Sofern die Library dort keine doubles frisst und ggf. zwischen Pizeln interpoliert ist i,j nach gängiger Notation eindeutiger.


Anmelden zum Antworten