Bilddatei laden

Need_Help1993

Bekanntes Mitglied
huhu. ich habe die Aufgabe eine Bilddatei zu laden.
dazu habe ich 2 .class dateien (SimpleImage und ImageViewer) und natürlich das bild namens lenna.pgn

hatte eine Klasse ImageReader vorgegeben, in der noch ToDo´s drin waren.
diese TODO´s habe ich nun bearbeitet. dabei gibts jedoch ein kleines problemchen. ich bekomme eine warnung von eclipse, und beim ausführen der klasse bekomme ich nur einen weißen kasten. wäre nett, wenn sich das mal jemand anschauen könnte:

Java:
 import java.io.*;

/**
   Klasse zum Laden einer PGM-Bilddatei.
   Im Konstruktor der Klasse wird der Dateiname übergeben und die ersten vier Zeilen der Datei werden eingelesen.
   Der Aufruf von readImage() liest dann den Rest der Datei zeilenweise ein und gibt ein SimpleImage zurück.
*/
class ImageReader
{
    /// Reader zum Lesen aus der Datei.
    BufferedReader reader;
    /// Breite und Höhe des zu ladenden Bildes.
    int width, height;
    
    /**
       Initialisiert das Attribut reader mit einem Stream, der aus der Datei mit dem übergebenen Namen liest.
       Die ersten vier Zeilen der Datei werden eingelesen und die Attribute width und height ebenfalls initialisiert.
    */
    ImageReader(String fileName) throws IOException
    {
	reader = newBufferedReader(new FileReader(fileName));// TODO: BufferedReader reader initialisieren.
	readHeader();
    }

    /**
       Liest die ersten vier Zeilen aus der Datei.
       Die Zahlen aus der zweiten und dritten Zeile werden in den Attributen width und height gespeichert.
       Die erste und vierte Zeile werden übersprungen.
     */
    private void readHeader() throws IOException
    {
	reader.readLine();// TODO: Erste Zeile der Datei überspringen
	String widthStr = reader.readLine();   // TODO: Zweite Zeile aus Datei lesen.
	String heightStr = reader.readLine();   // TODO: Dritte Zeile aus Datei lesen.
	reader.readLine();// TODO: Vierte Zeile der Datei überspringen.
	width = Integer.parseInt(widthStr);
	height = Integer.parseInt(heightStr);
    }

    /**
       Liest eine Pixelzeile aus der Datei aus.
       Eine Zeile der Datei besteht aus durch Leerzeichen getrennten Zahlenwerten.
       Die gelesene Zeile line vom Typ String wird mittels String[] line.split(" ") an ihren Leerzeichen in einen Array aus Stringstücken zerschnitten.
       Diese werden dann einzeln nach short konvertiert.
       Der resultierende short-Array wird dann zurückgegeben.
     */
    private short[] readLine() throws IOException
    {
	short[] result = new short[width];
	String[]line = reader.readLine().split("");// TODO: Eine Zeile aus Datei lesen und Werte in result schreiben.
	
	for(int i=0; i < width; i++){
		result[i]=Short.parseShort(line[i]);
	}
	return result;
    }

    /**
       Liest die komplette Bilddatei und gibt das Bild als SimpleImage zurück.
       Die Datei wird zeilenweise eingelesen (sie enthält genau height Zeilen).
       Jede Zeile wird dann pixelweise in das Ergebnisbild übertragen.
       Jede Zeile enthält genau width Pixel.
     */
    SimpleImage readImage() throws IOException
    {
    // TODO: Erzeugen eines neuen SimpleImage.
	//       Datei zeilenweise einlesen und Pixelwerte in Bild übertragen.
	//       SimpleImage zurückgeben.
    	SimpleImage s = new SimpleImage(width, height);
    		for(int i = 0; i < height; i++){
    			short[]r=readLine();
    			
    		for(int j = 0; j < r.length; j++){
    			s.setPixelAt(j, i, r[j]);
    		}
    		}
    		return s;
    }
    
    /**
       Lädt ein Bild von der Festplatte und zeigt es auf dem Bildschirm an.
     */
    public static void main(String[] args)
    {
	try
	{
	    ImageViewer viewer = new ImageViewer();
	    ImageReader ir = new ImageReader("lenna.pgm");
	    SimpleImage image = ir.readImage();
	    viewer.showImage(image);
	}
	catch(IOException e)
	{
	    System.out.println("Fehler beim Öffnen der Datei.");
	}
    }
}

warnung kommt in zeile 21 "BuffaredReader ist undefiniert für ImageReader
 
huhu. ich habe die Aufgabe eine Bilddatei zu laden.
dazu habe ich 2 .class dateien (SimpleImage und ImageViewer) und natürlich das bild namens lenna.pgn

hatte eine Klasse ImageReader vorgegeben, in der noch ToDo´s drin waren.
diese TODO´s habe ich nun bearbeitet. dabei gibts jedoch ein kleines problemchen. ich bekomme eine warnung von eclipse, und beim ausführen der klasse bekomme ich nur einen weißen kasten. wäre nett, wenn sich das mal jemand anschauen könnte:

Java:
 import java.io.*;

/**
   Klasse zum Laden einer PGM-Bilddatei.
   Im Konstruktor der Klasse wird der Dateiname übergeben und die ersten vier Zeilen der Datei werden eingelesen.
   Der Aufruf von readImage() liest dann den Rest der Datei zeilenweise ein und gibt ein SimpleImage zurück.
*/
class ImageReader
{
    /// Reader zum Lesen aus der Datei.
    BufferedReader reader;
    /// Breite und Höhe des zu ladenden Bildes.
    int width, height;
    
    /**
       Initialisiert das Attribut reader mit einem Stream, der aus der Datei mit dem übergebenen Namen liest.
       Die ersten vier Zeilen der Datei werden eingelesen und die Attribute width und height ebenfalls initialisiert.
    */
    ImageReader(String fileName) throws IOException
    {
	reader = newBufferedReader(new FileReader(fileName));// TODO: BufferedReader reader initialisieren.
	readHeader();
    }

    /**
       Liest die ersten vier Zeilen aus der Datei.
       Die Zahlen aus der zweiten und dritten Zeile werden in den Attributen width und height gespeichert.
       Die erste und vierte Zeile werden übersprungen.
     */
    private void readHeader() throws IOException
    {
	reader.readLine();// TODO: Erste Zeile der Datei überspringen
	String widthStr = reader.readLine();   // TODO: Zweite Zeile aus Datei lesen.
	String heightStr = reader.readLine();   // TODO: Dritte Zeile aus Datei lesen.
	reader.readLine();// TODO: Vierte Zeile der Datei überspringen.
	width = Integer.parseInt(widthStr);
	height = Integer.parseInt(heightStr);
    }

    /**
       Liest eine Pixelzeile aus der Datei aus.
       Eine Zeile der Datei besteht aus durch Leerzeichen getrennten Zahlenwerten.
       Die gelesene Zeile line vom Typ String wird mittels String[] line.split(" ") an ihren Leerzeichen in einen Array aus Stringstücken zerschnitten.
       Diese werden dann einzeln nach short konvertiert.
       Der resultierende short-Array wird dann zurückgegeben.
     */
    private short[] readLine() throws IOException
    {
	short[] result = new short[width];
	String[]line = reader.readLine().split("");// TODO: Eine Zeile aus Datei lesen und Werte in result schreiben.
	
	for(int i=0; i < width; i++){
		result[i]=Short.parseShort(line[i]);
	}
	return result;
    }

    /**
       Liest die komplette Bilddatei und gibt das Bild als SimpleImage zurück.
       Die Datei wird zeilenweise eingelesen (sie enthält genau height Zeilen).
       Jede Zeile wird dann pixelweise in das Ergebnisbild übertragen.
       Jede Zeile enthält genau width Pixel.
     */
    SimpleImage readImage() throws IOException
    {
    // TODO: Erzeugen eines neuen SimpleImage.
	//       Datei zeilenweise einlesen und Pixelwerte in Bild übertragen.
	//       SimpleImage zurückgeben.
    	SimpleImage s = new SimpleImage(width, height);
    		for(int i = 0; i < height; i++){
    			short[]r=readLine();
    			
    		for(int j = 0; j < r.length; j++){
    			s.setPixelAt(j, i, r[j]);
    		}
    		}
    		return s;
    }
    
    /**
       Lädt ein Bild von der Festplatte und zeigt es auf dem Bildschirm an.
     */
    public static void main(String[] args)
    {
	try
	{
	    ImageViewer viewer = new ImageViewer();
	    ImageReader ir = new ImageReader("lenna.pgm");
	    SimpleImage image = ir.readImage();
	    viewer.showImage(image);
	}
	catch(IOException e)
	{
	    System.out.println("Fehler beim Öffnen der Datei.");
	}
    }
}

warnung kommt in zeile 21 "BuffaredReader ist undefiniert für ImageReader


Das ist aber nicht ganzer Quelltext !?
 
ähm doch?
da sind noch die beiden .class dateien, sonst gibts nichts, und die ImageReader class war ja auch schon vorgegeben. ich musste nur bei den TODO stellen den Source code ergänzen, und das habe ich ja gemacht. funktioniert doch auch super... nur fehlt eben das bild, weil in zeile 21 ne warnung kommt
 
ähm doch?
da sind noch die beiden .class dateien, sonst gibts nichts, und die ImageReader class war ja auch schon vorgegeben. ich musste nur bei den TODO stellen den Source code ergänzen, und das habe ich ja gemacht. funktioniert doch auch super... nur fehlt eben das bild, weil in zeile 21 ne warnung kommt

Wo liegt deine Bilddatei? Hast du den Pfad zum Bild angegeben? Soll dein Bild nur geladen werden, oder auch angezeigt werden? Wenn es angezeigt werden soll, dann wo? In der Console wird es wohl nicht gehen, brauchst sicher eine GUI, JFrame etc., oder? Ich habe es zumindest so frueher gemacht.
 
also die Bilddatei liegt in dem verzeichnis, in dem auch die ImageReader datei liegt.
(C:\Users\***\Documents\Entwicklung_Programmierung\Java\Eclipse\Bildloader_Lenna\bin)
(das Bild wird aber auch im Projektordner in Eclipse angezeigt <---- habe es dort importiert)

das Bild soll angezeigt werden (GUI ist schon so vorhanden, dass es funktioniert)
wenn ich die Klasse ImageReader ausführe öffnet sich ein fenster, das auch die richtige breite und höhe hat, aber es ist ganz weiß, und da sollte eigentlich das bild drin sein.

das mit dem Buffered reader habe ich selbst so gemacht, weil ich dachte, dass es funktioniert (was anscheinend nicht der fall ist)

kann mir da jemand weiterhelfen? <---- bzw. was müsste in die TODO in Zeile 21 rein?

der restliche code soll nicht verändert werden, nur die TODO´s
 
gott bin ich blöd..... ich habe die warnung nur bekommen, weil zwischen new und buffered reader kein leerzeichen war.....

naja aber das Bild wird mir trotzdem noch nicht angezeigt.... woran liegts?
 
folgende exceptions werden mir geworfen:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Short.parseShort(Unknown Source)
at java.lang.Short.parseShort(Unknown Source)
at ImageReader.readLine(ImageReader.java:53)
at ImageReader.readImage(ImageReader.java:71)
at ImageReader.main(ImageReader.java:89)
 
Ich würds mal so probieren (hab das jetzt aber nicht getestet):

String dir = "dir";
try {
InputStream in = this.getClass().getResourceAsStream(dir);
BufferedReader br = new BufferedReader( new InputStreamReader(in));
catch(IOException ex){}

Gruß
Badmeister
 
vielen Dank.
wir sind schonmal auf dem richtigen weg. habe gerade nochmal in meinen Blättern egschaut, da steht auch, dass wir streams statt java-api benutzen sollen.

aber da ist noch eine Fehlermeldung von eclipse, was die Klammern angeht, die ich nicht wegbekomme:
Java:
 ImageReader(String fileName) throws IOException
    {
    	String dir = "dir";    // TODO: BufferedReader reader initialisieren.
    	try {
    	InputStream in = this.getClass().getResourceAsStream(dir);
    	BufferedReader reader = new BufferedReader( new InputStreamReader(in));
    	catch(IOException ex){
    		System.out.println("Fehler");}
in Zeile 6 sagt er bräuchte ich ne }
aber ich hab schon hin und her probiert, bekomms nicht hin...
 
Also wenn ich deinen Code bei mir in Eclipse versuche, da gibts lauter Fehler und Programm laesst sich nicht ausfuehren.

Du erzeugst in main() ein Istanz viewer der Klasse ImageViewer, in deinem Quelltext ist diese Klasse aber nicht vorhanden, das selbe ist mit SimpleImage und Klasse ImageReader wuerde ich public machen und bei Erzeugung der Instanz ImageReader ir = new ImageReader("lenna.pgm"); die Klammern leer lassen, was hat lenna.pgm dort zu suchen?

Frage mich echt warum bei dir da etwas angezeigt wird, vielleicht doch nicht?
Du hast echt doch nichts fuer eine GUI in deinem Programm
 
SimpleImage und ImageReader sind als .class dateien vorhanden 😉

lenna.png heißt das bild, das ich laden möchte....
habe ich aber oben schon mehrfach geschrieben...


ich bekomme jetzt noch folgende meldungen:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unreachable catch block for IOException. This exception is never thrown from the try statement body

at ImageReader.<init>(ImageReader.java:26)
at ImageReader.main(ImageReader.java:98)

Java:
 ImageReader(String fileName) throws IOException
    {
    	String dir = "dir";    // TODO: BufferedReader reader initialisieren.
    	try {
    	InputStream in = this.getClass().getResourceAsStream(dir);
    	BufferedReader reader = new BufferedReader( new InputStreamReader(in));
    	}
    	catch(IOException ex){
    		System.out.println("Fehler");}

der catch block ist bei mir unerreichbar.. aber anderst kann ichs mit den klammern und ; nicht lösen....
 
Und was ist das fuer ein Format .pgm ? Ich weiss nicht ob es so etwas gibts. Ich kenne jpg und jpge ... pgm kommt mir seltsam vor:rtfm:
 
...... bitte lies dir doch erstmal den threat hier durch, bevor du sowas schreibst.....

zum 100. mal. ich muss nur dort ergänzen wo TODO steht, der rest ist alles schon gegeben!! <---- und somit gehe ich auch nicht davon aus, dass es falsch ist... und pgn gibts. ist ein schwarz weiß format
 
danke EikeB

bleiben noch folgende meldungen übrig:

Exception in thread "main" java.lang.NullPointerException
at java.io.Reader.<init>(Unknown Source)
at java.io.InputStreamReader.<init>(Unknown Source)
at ImageReader.<init>(ImageReader.java:23)
at ImageReader.main(ImageReader.java:96)
 
SimpleImage und ImageReader sind als .class dateien vorhanden 😉

lenna.png heißt das bild, das ich laden möchte....
habe ich aber oben schon mehrfach geschrieben...

lenna.png heisst das Bild, aber was hat sie dort in den Klammern zu suchen? Ist doch kein Wunschkonzert, du kannst sie doch nicht einfach irgendwo in die Klammern setzen, weil du es aufrufen willst
 
der code sieht momentan folgendermaßen aus
Java:
import java.io.*;

/**
   Klasse zum Laden einer PGM-Bilddatei.
   Im Konstruktor der Klasse wird der Dateiname übergeben und die ersten vier Zeilen der Datei werden eingelesen.
   Der Aufruf von readImage() liest dann den Rest der Datei zeilenweise ein und gibt ein SimpleImage zurück.
*/
class ImageReader
{
    /// Reader zum Lesen aus der Datei.
    BufferedReader reader;
    /// Breite und Höhe des zu ladenden Bildes.
    int width, height;
    
    /**
       Initialisiert das Attribut reader mit einem Stream, der aus der Datei mit dem übergebenen Namen liest.
       Die ersten vier Zeilen der Datei werden eingelesen und die Attribute width und height ebenfalls initialisiert.
    */
    ImageReader(String fileName) throws IOException
    {
    	String dir = "dir";    // TODO: BufferedReader reader initialisieren.
    	InputStream in = this.getClass().getResourceAsStream(dir);
    	BufferedReader reader = new BufferedReader( new InputStreamReader(in));
    	    	
    	
	readHeader();
    }

    /**
       Liest die ersten vier Zeilen aus der Datei.
       Die Zahlen aus der zweiten und dritten Zeile werden in den Attributen width und height gespeichert.
       Die erste und vierte Zeile werden übersprungen.
     */
    private void readHeader() throws IOException
    {
	reader.readLine();// TODO: Erste Zeile der Datei überspringen
	String widthStr = reader.readLine();   // TODO: Zweite Zeile aus Datei lesen.
	String heightStr = reader.readLine();   // TODO: Dritte Zeile aus Datei lesen.
	reader.readLine();// TODO: Vierte Zeile der Datei überspringen.
	width = Integer.parseInt(widthStr);
	height = Integer.parseInt(heightStr);
    }

    /**
       Liest eine Pixelzeile aus der Datei aus.
       Eine Zeile der Datei besteht aus durch Leerzeichen getrennten Zahlenwerten.
       Die gelesene Zeile line vom Typ String wird mittels String[] line.split(" ") an ihren Leerzeichen in einen Array aus Stringstücken zerschnitten.
       Diese werden dann einzeln nach short konvertiert.
       Der resultierende short-Array wird dann zurückgegeben.
     */
    private short[] readLine() throws IOException
    {
	short[] result = new short[width];
	String[]line = reader.readLine().split("");// TODO: Eine Zeile aus Datei lesen und Werte in result schreiben.
	
	for(int i=0; i < width; i++){
		result[i]=Short.parseShort(line[i]);
	}
	return result;
    }

    /**
       Liest die komplette Bilddatei und gibt das Bild als SimpleImage zurück.
       Die Datei wird zeilenweise eingelesen (sie enthält genau height Zeilen).
       Jede Zeile wird dann pixelweise in das Ergebnisbild übertragen.
       Jede Zeile enthält genau width Pixel.
     */
    SimpleImage readImage() throws IOException
    {
    // TODO: Erzeugen eines neuen SimpleImage.
	//       Datei zeilenweise einlesen und Pixelwerte in Bild übertragen.
	//       SimpleImage zurückgeben.
    	SimpleImage s = new SimpleImage(width, height);
    		for(int i = 0; i < height; i++){
    			short[]r=readLine();
    			
    		for(int j = 0; j < r.length; j++){
    			s.setPixelAt(j, i, r[j]);
    		}
    		}
    		return s;
    }
    
    /**
       Lädt ein Bild von der Festplatte und zeigt es auf dem Bildschirm an.
     */
    public static void main(String[] args)
    {
	try
	{
	    ImageViewer viewer = new ImageViewer();
	    ImageReader ir = new ImageReader("lenna.pgm");
	    SimpleImage image = ir.readImage();
	    viewer.showImage(image);
	}
	catch(IOException e)
	{
	    System.out.println("Fehler beim Öffnen der Datei.");
	}
    }
}
 
Kannst mir erklaeren was das hier soll in Klammern?

Java:
  ImageReader ir = new ImageReader("lenna.pgm");

Bei dir ist es sicherlich rot markiert in Eclipse, oder ?
 
Wenn du einfach Quellcode fuer einen Bildbetrachter suchst und keine Ahnung hast, dann frage es doch einfach, wozu die ganzen Geschichten, es zeigt etwas an, aber kein Bild, kann es nicht, jeder kann doch deinen Quellcode selber in Eclipse ausprobieren, wozu luegen? Du brauchst eine Klasse die von JFrame erbt, damit GUI angezeigt wird und die Klasse musst du public deklarieren, damit siein main() aufrufen kannst und einen Konstruktor brauchst auch noch
 
@bandy:
Warum? Der Konstruktor ist doch hier definiert:
Java:
ImageReader(String fileName)
 
@bandy:
Warum? Der Konstruktor ist doch hier definiert:
Java:
ImageReader(String fileName)

Ja, der ist hier definiert, aber richtigen Sinn macht der Konstruktor bei Klassen die von JFrame erben, weil man dort die ganzen Rahmengroessen etc. definiert, sonst macht ja nach meinen erkentnissen ein Konstruktor wenig Sinn, was er dort schriem, kann man ja in jeder anderen Methode schreiben und nicht unbeding in der Methode vom Typ der Klasse(also dem Konstruktor), aber ich poste ihm meinen Quelltext fuer einen Bildbetrachter
 
Ich verstehe zwar bandy's Kritik nicht dein logischer Fehler liegt aber trotzdem im Konstruktor.

Java:
ImageReader(String fileName) throws IOException
    {
        String dir = "dir";    // diese Zuweisung stimmt nicht: z.B. "./bin/" oder ein absoluter Pfad
        InputStream in = this.getClass().getResourceAsStream(dir+fileName);//das hat auch nicht gestimmt
        BufferedReader reader = new BufferedReader( new InputStreamReader(in));
    readHeader();
    }
 
bei mir ist überhaupt nichts rot markiert....
und wenn du mich noch einmal fragst, was der gegebene code soll bekomm ich hier echt zustände....

für dich nochmal zum mitschreiben....

der code nach dem du die ganze zeit fragst ist vorgegeben und FEST! also stimmt er acuh, und daran wird nichts geändert
 
Ich verstehe zwar bandy's Kritik nicht dein logischer Fehler liegt aber trotzdem im Konstruktor.

Java:
ImageReader(String fileName) throws IOException
    {
        String dir = "dir";    // diese Zuweisung stimmt nicht: z.B. "./bin/" oder ein absoluter Pfad
        InputStream in = this.getClass().getResourceAsStream(dir+fileName);//das hat auch nicht gestimmt
        BufferedReader reader = new BufferedReader( new InputStreamReader(in));
    readHeader();
    }

vielen dank, du bist meine rettung 🙂

das bild liegt hier: C:\Users\MaxMustermann\Documents\Entwicklung_Programmierung\Java\Eclipse\Lenna

wie müsste dan der code lauten?
 
LennaF.gif
 
Probiere es mal so wie Kevin es schrieb und ändere folgende Zeile:

String dir = "C:\Users\MaxMustermann\Documents\Entwicklung_Programmierung\Java\Eclipse\Lenna\";
 
funktioniert nicht...
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )

at ImageReader.<init>(ImageReader.java:21)
at ImageReader.main(ImageReader.java:91)


der ganze s***** kann doch nicht so schwer sein ey..... das ding nervt mich schon den ganzen tag ...
 
dann so

String dir = "C:\\Users\\MaxMustermann\\Documents\\Entwicklung_Programmierung\\Java\\Eclipse\\Lenna\\";
 
Ok bei mir läufts jetzte, mit folgenden Änderungen zu deinem Code:

Java:
        InputStream in = this.getClass().getResourceAsStream(fileName);//hab das Verzeichniss weggelassen, liegt ja im selben
        BufferedReader reader = new BufferedReader( new InputStreamReader(in));

und die wesentliche Änderung ist in der readLine Methode:

Java:
private short[] readLine() throws IOException
    {
    short[] result = new short[width];
    String[]line = reader.readLine().split(" ");// Hier muss ein Leerzeichen rein
    
    for(int i=0; i < width; i++){
        result[i]=Short.parseShort(line[i]);
    }
    return result;
    }
 
vielen vioelen Dank schonmal. aber bei mir läufts irgendwie trotzdem noch nicht...

code sieht folgendermaßen aus:
Java:
import java.io.*;

/**
   Klasse zum Laden einer PGM-Bilddatei.
   Im Konstruktor der Klasse wird der Dateiname übergeben und die ersten vier Zeilen der Datei werden eingelesen.
   Der Aufruf von readImage() liest dann den Rest der Datei zeilenweise ein und gibt ein SimpleImage zurück.
*/
class ImageReader
{
    /// Reader zum Lesen aus der Datei.
    BufferedReader reader;
    /// Breite und Höhe des zu ladenden Bildes.
    int width, height;
    
    /**
       Initialisiert das Attribut reader mit einem Stream, der aus der Datei mit dem übergebenen Namen liest.
       Die ersten vier Zeilen der Datei werden eingelesen und die Attribute width und height ebenfalls initialisiert.
    */
    ImageReader(String fileName) throws IOException
    {
    	// TODO: BufferedReader reader initialisieren.
    	 InputStream in = this.getClass().getResourceAsStream(fileName);
         BufferedReader reader = new BufferedReader( new InputStreamReader(in));   
    	    	    	
    readHeader();
    }

    /**
       Liest die ersten vier Zeilen aus der Datei.
       Die Zahlen aus der zweiten und dritten Zeile werden in den Attributen width und height gespeichert.
       Die erste und vierte Zeile werden übersprungen.
     */
    private void readHeader() throws IOException
    {
	reader.readLine();// TODO: Erste Zeile der Datei überspringen
	String widthStr = reader.readLine();   // TODO: Zweite Zeile aus Datei lesen.
	String heightStr = reader.readLine();   // TODO: Dritte Zeile aus Datei lesen.
	reader.readLine();// TODO: Vierte Zeile der Datei überspringen.
	width = Integer.parseInt(widthStr);
	height = Integer.parseInt(heightStr);
    }

    /**
       Liest eine Pixelzeile aus der Datei aus.
       Eine Zeile der Datei besteht aus durch Leerzeichen getrennten Zahlenwerten.
       Die gelesene Zeile line vom Typ String wird mittels String[] line.split(" ") an ihren Leerzeichen in einen Array aus Stringstücken zerschnitten.
       Diese werden dann einzeln nach short konvertiert.
       Der resultierende short-Array wird dann zurückgegeben.
     */
 // TODO: Eine Zeile aus Datei lesen und Werte in result schreiben.
    
    private short[] readLine() throws IOException
    {
    short[] result = new short[width];
    String[]line = reader.readLine().split(" ");
    
    for(int i=0; i < width; i++){
        result[i]=Short.parseShort(line[i]);
    }
    return result;
    }

    /**
       Liest die komplette Bilddatei und gibt das Bild als SimpleImage zurück.
       Die Datei wird zeilenweise eingelesen (sie enthält genau height Zeilen).
       Jede Zeile wird dann pixelweise in das Ergebnisbild übertragen.
       Jede Zeile enthält genau width Pixel.
     */
    SimpleImage readImage() throws IOException
    {
    // TODO: Erzeugen eines neuen SimpleImage.
	//       Datei zeilenweise einlesen und Pixelwerte in Bild übertragen.
	//       SimpleImage zurückgeben.
    	SimpleImage s = new SimpleImage(width, height);
    		for(int i = 0; i < height; i++){
    			short[]r=readLine();
    			
    		for(int j = 0; j < r.length; j++){
    			s.setPixelAt(j, i, r[j]);
    		}
    		}
    		return s;
    }
    
    /**
       Lädt ein Bild von der Festplatte und zeigt es auf dem Bildschirm an.
     */
    public static void main(String[] args)
    {
	try
	{
	    ImageViewer viewer = new ImageViewer();
	    ImageReader ir = new ImageReader("lenna.pgm");
	    SimpleImage image = ir.readImage();
	    viewer.showImage(image);
	}
	catch(IOException e)
	{
	    System.out.println("Fehler beim Öffnen der Datei.");
	}
    }
}

Exception in thread "main" java.lang.NullPointerException
at ImageReader.readHeader(ImageReader.java:35)
at ImageReader.<init>(ImageReader.java:25)
at ImageReader.main(ImageReader.java:93)
 
Mist, den Fehler hab ich komplett übersehen:
Java:
ImageReader(String fileName) throws IOException
    {
        // TODO: BufferedReader reader initialisieren.
         InputStream in = this.getClass().getResourceAsStream(fileName);
         /*BufferedReader*/ reader = new BufferedReader( new InputStreamReader(in));   //sonst würdest du einfach eine lokale Variable definieren und nicht die Instanzvariable initialiesieren
    readHeader();
    }
 

Zurück
Oben