FileInputStream - Breite einer bmp-Datei??

JG12111989

Mitglied
Hallo zusammen,

ich habe ein Problem mit einer Aufgabe, die ich lösen soll und hoffe, hier Hilfe zu finden...
Es geht darum, dass ich eine Bitmap-Datei einlesen soll und mir dann dessen Breite ausgeben lassen soll. Die Breite ist im Dateikopf an Offset-Position 18 mit 4 Bytes gespeichert. Allerdings muss ich sagen, dass es mir momentan noch rätselhaft erscheint, wie ich den Dateikopf ausgeben lassen will.... Kann mir jemand weiterhelfen? Ich stehe grad irgendwie auf dem Schlauch....

Danke im Voraus!
 
Musst du die Datei von Hand einlesen und parsen oder ist es dir egal, wie du an die Informationen ran kommst?
 
Musst du die Datei von Hand einlesen und parsen oder ist es dir egal, wie du an die Informationen ran kommst?

Die Datei sollte von Hand eingelesen werden. Ich habe zurzeit das Thema Datenverarbeitung in Java und da haben wir das Anwenden der Klasse FileInputStream durchgenommen und mit dieser Aufgabe soll das Gelernte nun verfestigt werden ^^'
 
Guck dir doch an, was gegeben ist. Und zwar ist dein Offset an Position 18 und du sollst von da an 4 Bytes lesen.
Also bietet FileInputStream etwas an, das genau dies kann oder müssen wir den Input von vorne lesen? Mal in der Doku sehen.. Aha! Da gibt es skip() und read(Byte b)!
Super. Also könnte es bspw so was sein (oder so ähnlich):

Code:
File f = new File(pfadZumImg);
Byte[] b;
Try(FileInputStream fis = new FileInputStream(f)){
fis.skip(18);
b =fis.read(4);

} catch {...}

Sorry ich schreibe vom Handy aus.

Edit: es gibt viele Wege das zu lösen. Vom FIS direkt in ein Byte Array und per Indice darauf zugreifen. Oder in ein Bitmap umwandeln und daraus die Bytes lesen.
 
Hallo,

es hat einmal vor Jahren jemand eine Klasse namens ImageInfo.java erstellt. Diese Klasse stellt genau diese Informationen verschiedenster Bildtypen zur Verfügung.
Evtl. hilft Dir diese Klasse weiter.

Gruß
Uwe
 

Anhänge

Ich habe es nun wie folgt gelöst:
Java:
package Files;
import java.io.*;
import java.util.*;

public class BitmapBreite {

  
  public static void main(String[] args) {
  Scanner in = new Scanner(System.in);
  String filename=null;
  byte[] b = new byte[4];

  try{
  filename=in.nextLine();
  FileInputStream fis = new FileInputStream(filename);
  fis.skip(18);
  for(int i=0; i<b.length; i++){
  b[i]=(byte) fis.read();
  }
  System.out.println("BitmapBreite: "+b[0]+b[1]+b[2]+b[3]);
  fis.close();
  }
  catch(FileNotFoundException e){
  System.out.println("File not found");
  }
  catch(IOException e){
  System.out.println("Fehler: "+e);
  }
  }
  
}

Gibt es irgendwelche Einwände?
 
Zuletzt bearbeitet von einem Moderator:
Nja die gibt es schon. Warum verwendest du keine try-resource?
Warum übergibst du dein byte-Array nicht der FileInputStream::read(byte[]) Methode?

Was auch noch wichtig ist, das Format ist in Little-Endian codiert!
 

Zurück
Oben