# Image -> BufferedImage



## muril (13. Feb 2008)

Hi,
Wie schaff ich es ein Image in ein BufferedImage umzuwandeln?
mfg muril


----------



## Quaxli (13. Feb 2008)

Hier ein grober Entwurf, u. U. nicht 100% fehlerfrei


```
Image img = ..... // so wie Du es jetzt lädst
BufferedImage buf = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.OPAQUE);
Graphics g = buf.getGraphics();
g.drawImage(img,0,0,null);
```

Das ist aber keine schöne Lösung oben. Besser und einfacher wäre, wenn Du Dein Image gleich als BufferedImage lädst. Schau Dir dazu mal die Klasse ImageIO an.


----------



## Guest (13. Feb 2008)

also die zeile mag er gar nicht : 

```
BufferedImage bufimage =  new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.OPAQUE);
```

da kommt : 

Exception in thread "AWT-EventQueue-1" java.lang.IllegalArgumentException: Width
 (-1) and height (-1) cannot be <= 0
        at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Direct
ColorModel.java:999)
        at java.awt.image.BufferedImage.<init>(BufferedImage.java:312)
        at Editor.paint(Editor.java:836)
        at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
        at sun.awt.RepaintArea.paint(RepaintArea.java:224)
        at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:301)
        at java.awt.Component.dispatchEventImpl(Component.java:4486)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

ich guck mal ImageIO , danke


----------



## The_S (13. Feb 2008)

Ist dein Image evtl. noch nicht komplett geladen? Kannst du mit dem MediaTracker überprüfen.


----------



## Guest (13. Feb 2008)

Noch eine andere Frage, weilich das jetzt mit InputIO versuch:


```
BufferedImage bufimage = ImageIO.read(new File("c:/panzer.gif"));
```

schreibt er :

Editor.java:857: unreported exception java.io.IOException; must be caught or dec
lared to be thrown
                BufferedImage bufimage = ImageIO.read(new File("c:/panzer.gif"));

habs shcon mit throws exception probiert aber er schreibt immer gleichen Fehler
mfg muril


----------



## The_S (13. Feb 2008)

try - catch block außenrum!? throws sollte es aber auch tun.


----------



## Guest (13. Feb 2008)

ok try catch hat gefunkt und es lasst sich kompilieren...
jedoch zeigt es jetzt nix an ><
Hier ist der code es funktioniert wenn ich g verwende (also Graphics2D g2 = (Graphics2D)g also da sollte kein Fehler sein!


```
try{
		int iDegrees=0;
		int iSizeDiff = img.getWidth(this) - img.getHeight(this);
		int iSizeMax  = Math.max( img.getWidth(this), img.getHeight(this) );
		
		BufferedImage bufimage = ImageIO.read(new File("c:/panzer.gif"));;
	
		
		 
		Graphics2D g2 = (Graphics2D)bufimage.getGraphics();
		
		AffineTransform at = AffineTransform.getRotateInstance( 0, Math.PI/180., (iSizeMax+1)/2, (iSizeMax+1)/2 );
		g2.setTransform( at );
		
		if( 0 < iSizeDiff && (  90 == iDegrees || 180 == iDegrees ) )  iMoveY =  iSizeDiff;
		if( 0 > iSizeDiff && ( 180 == iDegrees || 270 == iDegrees ) )  iMoveX = -iSizeDiff;
		
		g2.drawImage( img, iMoveX, iMoveY, null );
		rotate++;
		}
		catch(Exception e){
		}
```


----------



## The_S (13. Feb 2008)

Es sollte createGraphics und nicht getGraphics heißen. Außerdem hab ich den Typ OPAQUE noch nie gesehen. Ein TYPE_INT_ARGB sollte es auch tun. (Aber evtl hat da Quaxli mehr Ahnung als ich  )

Deine Aussage zur (Fehler!?)Beschreibung verstehe ich nicht wirklihch.


----------



## Guest (13. Feb 2008)

ok createGraphics hat nix geändert zumindest net auf den ersten blick ^^

Fehler ist das das bild nicht im applet zu sehen ist!

mfg und dankefür die mühe ^^


----------



## The_S (13. Feb 2008)

wird ne exception geworfen?


----------



## Gast (13. Feb 2008)

nein


----------



## Gast (13. Feb 2008)

ich mach am besten dazu einen neuen thread auf diese problem is ja eigentlich gelöst


----------



## Quaxli (14. Feb 2008)

Funktioniert es, wenn Du die Rotation weg läßt?


----------



## Quaxli (14. Feb 2008)

Hier mal ein lauffähiges Beispiel. Dazu ein paar Anmerkungen:

- Die Rotation wird  nicht auf das Image, sondern auf das GraphicsObject der paint-Methode angewendet. Dadurch ist es notwendig, das Ganze hinterher zurück zu drehen, damit weitere Objekte (im Beispiel das grüne Quadrat) richtig gezeichnet werden.

- Die Grafik wird über einen InputStream geladen. Das ist auch die ideale Vorgehensweise, falls Du das Applet mal auf einer Web-Seite einbinden willst. Der Ordner pics muß im gleichen Verzeichnis, wie die class-Dateien sein.


```
import java.applet.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class BallBewegungDoppel extends Applet implements Runnable {

	private static final long	serialVersionUID	= 1L;

	// Variablen für die Doppelpufferung
	private Image							dbImage;
	private Graphics					dbg;
	BufferedImage buf;

	public void init() {
		setBackground(Color.blue);

		try {
			buf = ImageIO.read(getClass().getClassLoader().getResourceAsStream("pics/car.gif"));
		} catch (IOException e) {}
		
		this.setSize(300, 300);
	}

	public void start() {

		Thread th = new Thread(this);
		th.start();
	}

	public void stop() {

	}

	public void destroy() {

	}

	public void run() {

		while (true) {

			repaint();

			try {
				Thread.sleep(20);
			} catch (InterruptedException ex) {			}

		}
	}

	/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
	public void update(Graphics g) {
		if (dbImage == null) {
			dbImage = createImage(this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics();
		}

		dbg.setColor(getBackground());
		dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);

		dbg.setColor(getForeground());
		paint(dbg);

		g.drawImage(dbImage, 0, 0, this);
	}

	public void paint(Graphics g) {
		
    Graphics2D g2 = (Graphics2D) g;
    
    AffineTransform at = new AffineTransform();
    at.rotate(Math.toRadians(45),(50+(buf.getWidth()/2)),(50+(buf.getHeight()/2)));
    g2.setTransform( at );
    g.drawImage(buf, 50, 50, this);
    at.rotate(Math.toRadians(-45),(50+(buf.getWidth()/2)),(50+(buf.getHeight()/2)));
    g2.setTransform(at);
    g.setColor(Color.green);
    g.fillRect(100,100,20,20);
	}
		

}
```


----------



## muril (16. Feb 2008)

Srz das ich erst jetzt wieder reingeschaut hatte...
Danke ich hatte das eh zuerst so gehabt aber ohen umdrehen danach wieder und deshalb war allesgedreht  
Und weil ich wiedermal vielzu kompliziert dachte und mit derartigen AffineTransformationen noch net gearbeitet hatte, bin ich net aufs zurückdrehen gekommen  Najo danke!


----------

