Bitmap wird nicht geladen



  • Hi,
    Mein Problem ist, obwohl ich eine Datei öffne, scheinbar bei der Intialisierung der Variablen keine Daten rauskommen:

    File.open (FileName.c_str (), std::ios::in |  std::ios::binary);
    if (!File.is_open ()) return false;
    
    File.seekg (18, std::ios::beg);
    File >> BitmapWidth;
    File >> BitmapHeight;
    

    Nun sagt mein schlaues Buch, das ab Position 18 die Breiten bzw. Höhen inforamtionen der Bitmap stehen.
    Bei der Ausführung dieses Codes bleiben jedoch BitmapWidth und BitmapHeight beide 0. Die Bitmapdatei wird aber geöffnet, das zeigt die is_open funktion an. Die Bitmap selbst ist 400x500 Pixel groß und mit einem Bildbearbeitungsprogramm erezugt und vor der Nutzung im Programm auf 8 Bit umkonvertiert worden. Nur so, falls das von Bedeutung ist...Jedenfalls müssten mindestens die Maße aber einlesbar sein?!
    Es ist schon ne weile her, wo ich so ne Ladefunktion geschrieben hab, deshalb weiß ich nicht wo das Problem liegt. Mit filestreams aus C++ hab ich auch noch nicht oft gearbeitet.



  • *g* Bei meinen Problemen kann mir scheinbar niemand helfen...

    Ich hab festgestellt, dass ich nur das B und das M gleich am Anfang der Datei reinbekomme. Der Rest des File und des Info Headers sind auf null. Wie kann das sein? Die Datei ist auch nicht beschädigt, sonst würde ich sie ja nicht in Paint anschauen können.

    File >> FileHeader.Type[0] >> FileHeader.Type[1];
    //Bis hierhin Korrekt, B und M krieg ich.
    File >> FileHeader.Size ... //Das ist null.
    

    Was mach ich falsch? 😕



  • Mach doch mal als Test ein Byte Array, mit den z.b. ersten 32 Byte. Dann weisst du obs an der Dateifkt. liegt.

    Bye, TGGC (Dem beste BdT)



  • So siehts aus: 70 von 128 Bytes am Anfang sind null. Jedenfalls ungefähr. Das hilft mir jedoch nicht weiter, denn ich hab mir die Datei im Texteditor angeschaut und ich sehe am Anfang etliche Zeichen, wo die Fileheader sein sollten. Diese Zeichen kann man sogar optisch von den Bilddaten abgrenzen, d.h. da müssen irgendwelche daten sein.
    Was ist da los?



  • Du solltest die Datei mal in nen Hex- Editor laden und dort die Bytes testen!



  • DerAltenburger schrieb:

    Du solltest die Datei mal in nen Hex- Editor laden und dort die Bytes testen!

    ich weiß, ich werd mal später gucken. Doch es würde mir wirklich nichts nützen. Die Bitmap wird von jedem anderen Programm korrekt gelesen und angezeigt. Und normalerweise muss ich mich drauf verlassen könne, das File und Infp Header gleich am Anfang der Datei stehen und lesbar sind, sonst bringt mir alles nix.

    Kann es sein, dass Bitmap != Bitmap ist? Das es auch unterschiede zwischen den einzelnen Bitmaps selbst gibt?
    Außerdem sei noch angemerkt, das die Bitmap ursprünglich ein tif-bild war, jedoch umkonvertiert wurde. Tut aber warscheinlich nichts zur Sache.



  • Es gibt glaub ich ein altes und neues Format! (eines kann leicht komprimieren. Alte Programme koennen die nicht lesen.

    PS: Wo kann ich mal ein BM downloaden? dann schau ich mal rein.



  • hmm, könnte diese Format was mit dem FileHeader zu tun haben? Na hoffentlich ist die Lösung so trivial, sonst hab ich echt ein Problem 🙄

    Bmp-Files kannst du selber erzeugen, oder 😃
    Wenn nicht, schau hier
    http://images.google.de/imgres?imgurl=http://exclave.info/current/indo-bangla/rangpur1.bmp&imgrefurl=http://exclave.info/current/indo-bangla/indo-banglamaps.html&h=3150&w=1912&sz=812&tbnid=yAtRMRd6GPkJ:&tbnh=149&tbnw=91&start=26&prev=/images%3Fq%3D*.bmp%26start%3D20%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26sa%3DN

    😉
    War das erstbeste das ich finden konnte.



  • randa schrieb:

    So siehts aus: 70 von 128 Bytes am Anfang sind null. Jedenfalls ungefähr.

    Entweder benutzt du die Fileklasse falsch, oder sie ist selbst kaputt.

    Bye, TGGC \-/



  • @Randa

    Mit Deinen Bild- Dateien stimmt was nicht ! 🕶

    Auf Deinen Link sind BMP- Dateien die KEINE BMP sind! 😮

    Das sind JPG- Dateien - das kannste mit nem HEX- Editor sehen!

    PS: Die ersten Bytes sind 'normal' belegt!



  • Bitmap Dateien können Run-Length encodiert sein und haben bei 8 Bit noch eine Palette mitgespeichert.



  • Die Bitmap, die ich laden will, ist 8 Bit.

    Entweder benutzt du die Fileklasse falsch, oder sie ist selbst kaputt.

    Die ist narrensicher, was soll man da groß falsch benutzen? >> operator zum lesen, und fertig. Bei jedem Lesevorgang wird der File-Cursor um eins weiterbewegt. Was gibts da groß falsch zu benutzen?

    BitmapFileHeader FileHeader;
    BitmapInfoHeader InfoHeader;
    
    File >> FileHeader.Type[0] >> FileHeader.Type[1];
    File >> FileHeader.FileSize >> FileHeader.Reserved1 >> FileHeader.Reserved2;
    File >> FileHeader.PictureOffset;
    
    File >> InfoHeader.HeaderSize >> InfoHeader.BitmapWidth >> InfoHeader.BitmapHeight;
    File >> InfoHeader.Planes >> InfoHeader.BitmapColorDepth;
    File >> InfoHeader.Compression >> InfoHeader.CompressedImageSize;
    File >> InfoHeader.XPixelsPerMeter >> InfoHeader.YPixelsPerMeter;
    File >> InfoHeader.ColorsUsed >> InfoHeader.ColorsImportant;
    

    entsprechend:

    struct BitmapFileHeader
    {
    	char Type[2];
    	int FileSize;
    	short int Reserved1;
    	short int Reserved2;
    	int PictureOffset;
    };
    
    struct BitmapInfoHeader
    {
    	int HeaderSize;
    	int BitmapWidth;
    	int BitmapHeight;
    	short int Planes;
    	short int BitmapColorDepth;
    	int Compression;
    	int CompressedImageSize;
    	int XPixelsPerMeter;
    	int YPixelsPerMeter;
    	int ColorsUsed;
    	int ColorsImportant;
    };
    

    Da ist nichts falsch.

    Bitmap Dateien können Run-Length encodiert

    Was ist das? Hat das konkret Auswirkungen auf die FileHeader?



  • randa schrieb:

    Die ist narrensicher, was soll man da groß falsch benutzen? >> operator zum lesen, und fertig. Bei jedem Lesevorgang wird der File-Cursor um eins weiterbewegt. Was gibts da groß falsch zu benutzen?

    Das weiss ich nicht. Nur wenn du die ersten Bytes einliesst, und im Speicher steht dann was anderes als in der Datei, muss es wohl so sein. Sagt Sherlock.

    Bye, TGGC \-/



  • TGGC schrieb:

    muss es wohl so sein.

    Hmm, dann kannst du mir a)entweder sagen, was an obigem Code falsch ist oder b)es ist nicht falsch und Sherlock hat danebengeschnüffelt.
    Der Code oben ist so simpel das es nicht viele möglichkeiten gibt, was falsch gemacht wird. Das ist garantiert die allererste Leseoperation nach dem öffnen der Datei, und auch im rest der Programms stell ich sonst nix mit der Datei an.



  • no comments?

    Sonst habe ich diese Frage: Gibts eine Funktion, mit der ich eine Bitmap Laden kann? Undzwar sollte diese Funktion die Bitmap Daten in einer Datenstruktur speichern, aber einer, wo ich auf die Bilddaten und (bei 8 Bit) auf die Palette zugreifen kann um diese in eine eigene zu kopieren. Gibts das?



  • randa schrieb:

    TGGC schrieb:

    muss es wohl so sein.

    Hmm, dann kannst du mir a)entweder sagen, was an obigem Code falsch ist oder b)es ist nicht falsch und Sherlock hat danebengeschnüffelt.
    Der Code oben ist so simpel das es nicht viele möglichkeiten gibt, was falsch gemacht wird. Das ist garantiert die allererste Leseoperation nach dem öffnen der Datei, und auch im rest der Programms stell ich sonst nix mit der Datei an.

    Was soll ich dazu noch sagen, als das was oben steht. Der Fehler liegt dort, wo die Daten von der Platte in der Speicher geschaufelt werden. So hast du es beschrieben.

    Bye, TGGC \-/


Log in to reply