# Bilddatei laden



## Need_Help1993 (27. Nov 2011)

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:


```
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


----------



## bandy (27. Nov 2011)

Need_Help1993 hat gesagt.:


> 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.
> ...




Das ist aber nicht ganzer Quelltext !?


----------



## Need_Help1993 (27. Nov 2011)

ä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


----------



## bandy (27. Nov 2011)

Need_Help1993 hat gesagt.:


> ä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.


----------



## Badmeister (27. Nov 2011)

Hat das irgendeinen speziellen Grund, warum du einen BufferedReader benutzt und diese ganzen Methoden?

Über Image Icon wär es zumindest einfacher.


----------



## Need_Help1993 (27. Nov 2011)

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


----------



## Need_Help1993 (27. Nov 2011)

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?


----------



## Need_Help1993 (27. Nov 2011)

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)


----------



## Badmeister (27. Nov 2011)

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


----------



## Need_Help1993 (27. Nov 2011)

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:

```
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...


----------



## Kiri (27. Nov 2011)

} vor dem catch um den Try-Block zu schließen


----------



## bandy (27. Nov 2011)

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


----------



## Need_Help1993 (27. Nov 2011)

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)


```
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....


----------



## bandy (27. Nov 2011)

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:


----------



## Gast2 (27. Nov 2011)

siehe: Portable Graymap ? Wikipedia

Zu deinem Fehler:


> Unreachable catch block for IOException. This exception is never thrown from the try statement body


Da stehts doch klipp und klar. eine IOException wird bei dir nicht geworfen, also musst du sie auch nicht fangen.


----------



## Need_Help1993 (27. Nov 2011)

...... 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


----------



## Need_Help1993 (27. Nov 2011)

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)


----------



## bandy (27. Nov 2011)

Need_Help1993 hat gesagt.:


> 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


----------



## Need_Help1993 (27. Nov 2011)

der code sieht momentan folgendermaßen aus

```
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.");
	}
    }
}
```


----------



## bandy (27. Nov 2011)

Kannst mir erklaeren was das hier soll in Klammern?


```
ImageReader ir = new ImageReader("lenna.pgm");
```

Bei dir ist es sicherlich rot markiert in Eclipse, oder ?


----------



## bandy (27. Nov 2011)

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


----------



## Gast2 (27. Nov 2011)

@bandy: 
Warum? Der Konstruktor ist doch hier definiert:

```
ImageReader(String fileName)
```


----------



## bandy (27. Nov 2011)

EikeB hat gesagt.:


> @bandy:
> Warum? Der Konstruktor ist doch hier definiert:
> 
> ```
> ...



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


----------



## Kevin94 (27. Nov 2011)

Ich verstehe zwar bandy's Kritik nicht dein logischer Fehler liegt aber trotzdem im Konstruktor.


```
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();
    }
```


----------



## Need_Help1993 (27. Nov 2011)

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


----------



## Baum17 (27. Nov 2011)

lol die aufgabe hab ich!
Die ist voll einfach.

Du musst nur den bufferedreader benutzen.


----------



## Need_Help1993 (27. Nov 2011)

Kevin94 hat gesagt.:


> Ich verstehe zwar bandy's Kritik nicht dein logischer Fehler liegt aber trotzdem im Konstruktor.
> 
> 
> ```
> ...



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?


----------



## Need_Help1993 (27. Nov 2011)

Baum17 hat gesagt.:


> lol die aufgabe hab ich!
> Die ist voll einfach.
> 
> Du musst nur den bufferedreader benutzen.



den hatte ich vorher drin... funktioniert aber auch nicht?

- und außerdem steht auf der folie, dass wir nen stream benutzen sollen


----------



## bandy (27. Nov 2011)

Ok gehe schlaffen, kannst hier noch spielen und euch gegenseitig loben etc


----------



## Need_Help1993 (27. Nov 2011)

bandy geht mir aufn senkel... 
kannste bitte schlafen gehen?


----------



## Baum17 (27. Nov 2011)

Need_Help1993 hat gesagt.:


> den hatte ich vorher drin... funktioniert aber auch nicht?
> 
> - und außerdem steht auf der folie, dass wir nen stream benutzen sollen



Dem bufferedreader kannst du objekte aus der klasse File uebergeben....

Edit: brandy luegt!


----------



## Need_Help1993 (27. Nov 2011)

und das ganze sieht dan wie aus Baum?


----------



## Baum17 (27. Nov 2011)




----------



## Kiri (27. Nov 2011)

Probiere es mal so wie Kevin es schrieb und ändere folgende Zeile:

String dir = "C:\Users\MaxMustermann\Documents\Entwicklung_Programmierung\Java\Eclipse\Lenna\";


----------



## Need_Help1993 (27. Nov 2011)

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 ...


----------



## Need_Help1993 (27. Nov 2011)

Baum du hund  ich hab dir wohl schon oft genug geholfen... oder nicht?
wie wärs, wenn du mir jetzt mal hilfst?


----------



## Kiri (27. Nov 2011)

dann so

String dir = "C:\\Users\\MaxMustermann\\Documents\\Entwicklung_Programmierung\\Java\\Eclipse\\Lenna\\";


----------



## Need_Help1993 (27. Nov 2011)

ne, das wars auch nicht 


falls sich wirklich jemand mal die mühe machen sollte und es ausprobieren will, hier sind auch die. class dateien drin

File-Upload.net - Material.zip


----------



## Need_Help1993 (28. Nov 2011)

wie siehts aus? wäre echt wichtig


----------



## Kevin94 (28. Nov 2011)

Ok bei mir läufts jetzte, mit folgenden Änderungen zu deinem Code:


```
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:


```
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;
    }
```


----------



## Need_Help1993 (28. Nov 2011)

vielen vioelen Dank schonmal. aber bei mir läufts irgendwie trotzdem noch nicht... 

code sieht folgendermaßen aus:

```
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)


----------



## Kevin94 (28. Nov 2011)

Mist, den Fehler hab ich komplett übersehen:

```
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();
    }
```


----------



## Need_Help1993 (28. Nov 2011)

ach Kevin du bist ein Schatz  
meine Lenna ist endlich sichtbar. vielen vielen vielen Dank


----------

