Image will nicht laden

  • Themenstarter Themenstarter SenioreFamicom
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

SenioreFamicom

Gast
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: ?
 
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!
 
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...
 
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 🙁

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

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

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

Code:
// 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:

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

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

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

Code:
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 :?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben