# Image will nicht laden



## SenioreFamicom (17. Sep 2008)

Hallo Leute,
ich stehe auf dem Schlauch: bei meinem Programm tritt - wenn ich ein Bild (Datentyp Image) via ImageIO.read(...) lade und img.getGraphics() aufrufe - folgender Fehler auf:



> Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: getGraphics() not valid for images created with createImage(producer)
> at sun.awt.image.ToolkitImage.getGraphics(ToolkitImage.java:292)



Wie und mit was muss ich das Image umwandeln/casten/weiterverarbeiten, dass mein Programm nicht mehr diese Meldung liefert  :bahnhof: ?


----------



## manuche (17. Sep 2008)

Lies mal genau die Fehlermeldung:
"getGraphics() not valid for images created with createImage(producer)"

Du wirst hier bei einem Image vermutlich mit getGraphics nicht besonders glücklich...

*edit: Versuche es mal mit einem BufferedImage und wenn das nicht hilft poste ein wenig mehr Code!


----------



## Marco13 (17. Sep 2008)

Hm - poste ggf. mal ein kleines Compilierbares beispiel. Notfalls könnte man auch

BufferedImage bi = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
bi.getGraphics().drawImage(image, 0,0, null);

machen, und dann statt des geladenen 'images' das 'bi' verwenden, aber das sollte wohl nicht nötig sein...


----------



## SenioreFamicom (17. Sep 2008)

Okay, ich habe jetzt das Image als BufferedImage vorliegen. Trotzdem läuft hier noch nichts.
Ich habe mal versucht, den Code zu posten. Verzeiht mir, wenn es vlt. etwas unübersichtlich ist 


```
Exception occurred during event dispatching:
java.lang.ClassCastException: sun.awt.image.ToolkitImage
        at SN32.Editor.Map_Tiles.TileMap.updateMap(TileMap.java:32)
        at SN32.Editor.Map_Tiles.TileMap.<init>(TileMap.java:19)
...
```

Der Code ist mittlerweile sehr groß und verwoben, aber ich lade das Bild über


```
this.callingReference.updateMap(ImageIO.read(new File((this.list.getModel().getElementAt(0)).toString())));
```

rein. Danach wird es eigentlich nur noch als BufferedImage weitergereicht und ab und zu mit BufferedImage-Casting und getScaledInstance skaliert:


```
public void updateMap(BufferedImage img) {
        this.foreground.updateMap(img);
        this.foreground.setPreferredSize(new Dimension(img.getWidth() * 2, img.getHeight() * 2));
        this.updateScrollBar();
}
```

_foreground.updateMap_ überreicht das BufferedImage an _TileMap_:


```
// Foreground-Klasse
public void updateMap(BufferedImage img) {
        this.tileMap    = new TileMap(img, 2);   
        this.grid.setSize(this.tileMap.getWidth(), this.tileMap.getHeight());
}
```

Die Klasse TileMap enthält:


```
private BufferedImage   map;
    
    public  Tile [][]       tile;
    
    public TileMap(BufferedImage map, int scale) {
        this.SCALE  = scale;
        this.map    = map;
        this.updateMap();
    }
    
    
    public void updateMap() {
        this.width      = this.map.getWidth () / 16;            
        this.height     = this.map.getHeight() / 16;            
        this.tile = new Tile[this.width+1][this.height+1];     
        int cnt = -1;
                
        for (int y = 0; y < this.height; y++) {
            for (int x = 0; x < this.width; x++) {
                try {    
                    this.tile[x][y] = new Tile((BufferedImage) this.map.getSubimage(x * 16, y * 16, 16, 16).getScaledInstance(16 * this.SCALE, 16 * this.SCALE, 0), x * 16 * this.SCALE, y * 16 * this.SCALE, this.SCALE, cnt++, true);
                } catch (IOException exc) {
                    
                }
            }
        }
    }
```

Die Klasse Tile enthält wiederrum:


```
private BufferedImage       img         = null;
    private JNumerator  numerator   = null;
    
    
    public Tile(BufferedImage img, int x, int y, int scale, int ID, boolean enableNumerator) throws IOException {        
        this.x              = x;
        this.y              = y;
        this.SCALE          = scale;
        this.ID             = ID;
        this.img            = img;
        if (enableNumerator) {
            this.numerator = new JNumerator(img.getWidth(null), img.getHeight(null), ID, SCALE);
        }
    }
```

Der erste Code (ganz oben) wird zuerst ausgeführt. Danach wird irgendwann eine weitere Klasse ausgelöst:


```
public JPreviewRGBTile(JTransparentChooser callingReference) {
        this.callingReference = callingReference;
        this.setLayout(null);
        this.setBounds(12, 24, 67, 67);
        this.setBackground(Color.WHITE);
        this.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
        this.addMouseListener(this);
    }
    
    public void updateImg(BufferedImage img) {
        this.img = img;
    }

public void updateImage(BufferedImage img) {
       this.previewRGBTile.updateImg((BufferedImage) img.getScaledInstance(64, 64, BufferedImage.SCALE_DEFAULT));
    }

@Override
    public void paintComponent(Graphics g) {
        if (this.img != null) {
            g.drawImage(img, 0, 0, this);
        }
    }
```

Danach wird 


```
public void updateImage(BufferedImage img) {
       this.previewRGBTile.updateImg((BufferedImage) img.getScaledInstance(64, 64, BufferedImage.SCALE_DEFAULT));
    }
```

ausgeführt. Dabei handelt es sich bei previewRGBTile um die vorige Klasse.

Ich hoffe, das reicht an Code. Wenn es dennoch zu wenig ist, kann ich auch noch ein wenig mehr posten. Aber wie bereits erwähnt, es ist schon recht viel an Quellcode und nur schwer trennbar.

@ Marco: Wenn hier nix gefunden werden kann, versuche ich ein comp.bares Beispiel reinzustellen  :?


----------

