Java Java .bmp Datei -> Bildgrösse auslesen -> DataInputStream...

drunken.panda

Captain
Registriert
Juli 2008
Beiträge
3.922
Servus miteinander,

ich komme bei meinem Code nicht weiter und erkenne den Fehler nicht.

Bei dem .bmp (schwarz-weiß bmp) Format steht normalerweise in Zeile 18-21 als 4Byte Zahl (also Integer) die Bildbreite



Nun wollte ich diese gerne von meinen bmp's auslesen und überprüfen ob mein Code stimmt aber egal welche "skip" Stelle in in Zeile xy einsetze.

ich komme nicht auf die Bildbreite...


Habt ihr ne Idee wo der Denkansatz falsch ist?


Wieso zum Teufel kann man keinen Code mehr kopieren?

Also ich lese die Datei wie folgt ein:

Code:
Main.....
{

String input_file = null;


try(BufferedReader inp = new BufferedReader(newInputStreamReader(System.in))){

System.out.print("Quelldatei: ");
input_file = inp.readline();

Catch...{}


try (DataInputStream inp2 = new DataInputStream(new 
BufferedInputStream(new FileInputStream(input_file)));





{
inp2.skipBytes(17)  // bereits andere Zahlen getestet 16,17,18

System.out.println(inp2.readInt());


}

Code gerade von mir getippt also könnten Tippfehler drin sein aber geht jetzt nicht um Syntax
 
Zuletzt bearbeitet:
Hast du mal den Code für uns? Meine Glaskugel ist gerade zur Inspektion...
 
es geht um Zeile 24 und 26

wieso erhalte ich da nicht die 4 Byte Zahl die sich aus Byte 18-21 zusammensetzt richtig ausgegeben?

An den Bilddateien liegt es definitiv nicht bei Kumpels klappt es -> kenne aber deren Umsetzung nicht und da ich das für ein Einzelprojekt brauche, darf ich die auch nicht fragen.
 
Zuletzt bearbeitet:
Nope...

also jein ich weiß, dass ich nachher für die Bilddatei die Bytes in ihre 8 Bit zerlegen muss da ein bit (schwarz/weiss) realisiert.. Später steht ein Byte nämlich für 8 Bildpunkte (schwarz/weiss wie gesagt)
 
Kenne jetzt diese Methoden nicht, aber was ich so nachlese, könntest du ggf mit
Code:
System.out.println(inp2.readByte());
in Zeile 26 mal probieren?
 
Kann ich mal machen aber dann würde er mir ein Byte (8Bit) interpretieren und die Zahl (Bildbreite) ist dort als 4Byte Zahl (Integer) abgelegt daher würde ich da irgend ne falsche Zahl bekommen....

ja bekomme bei skip(17) 0 ausgegeben und bei skip(18) die -24 raisgeschmissen.

Bin mir ja nicht einmal bei der Skip Stelle sicher ob ich 18 oder 17 nehmen muss aber glaube 17 dürfte passen, da von 0 auf 17 und dann sich die methode (readInt) die nächsten 4 Byte also 18,19,20,21 schnappen würde... Glaube ich
 
Zuletzt bearbeitet:
drunken.panda schrieb:
Dann frag mal Wikipedia ;)

Eine Windows Bitmap Datei ist eine Erfindung von Microsoft und wurde das erste mal mit Windows 3.0 eingeführt: zu dieser Zeit lief Windows nur auf der x86 Architektur, welche Little Endian ist (auch "Intel"-Format genannt). Java hingegen ist Big Endian (auch "Motorola"-Format genannt), wodurch alle eingelesenen Daten als Big Endian interpretiert werden: in der Bitmap Datei hingegen sind die Daten Little Endian gespeichert, das heißt du musst die Bytereihenfolge noch manuell drehen.
 
Ah, daher der Hinweis von unserem Prof -> kleinsten Bytes werden vorne gespeichert. Habe ich bis jetzt nicht verstanden....

Danke für den Tipp könnte mich gut weitergebracht haben.

Sowas wurde in der Vorlesung nur mal so am Rande erwähnt....

Wie ist das denn jetzt mit dem skippen?

Wenn ich 17 mal skippe müsste ich mit dem nächsten Methodenaufruf an Byte 18 geraten oder? (Bilddatei fängt bei Byte 0 an).

Oder ruft die Methode noch das aktuelle Byte auf und setzt dann den "Zeiger" einen weiter...
 
Zuletzt bearbeitet:
Ohne Gewähr (Java ist jetzt nicht unbedingt meine Hauptprogrammiersprache), aber ich würde von 18 ausgehen: wenn du 1 Byte skippst, dann hast du Byte 0 übersprungen und startest bei Byte 1. Wenn du also ab Byte 18 lesen willst, dann würde das auf einen Skip von 18 hindeuten.
 
Naja im Zweifel werd ich es einfach ausprobieren müssen.

Trotzdem dankeschön.
 
Da Windows, hilft dir Microsoft gerne: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx da findest du alle Infos über Bitmaps...
Zum Auslesen, ich würd's einfach manuell mit ein bisschen Bit-Fiddling machen
Code:
//Windows To Network Long
int wtonl(int n){
return ((n>>24)&0xFF)|((n&0xFF0000)>>8)|((n&0xFF00)<<8)|((n&0xFF)<<24);
}
...
buf.skip(18);
int width=wtonl(buf.readInt());
int height=Math.abs(wtonl(buf.readInt()));
skip(x) überspringt x Bytes, also wenn du skip(0) aufrufst, ist es ein no-op. Alles andere wäre verwirrend.
 
Zurück
Oben