Image -> BufferedImage

Status
Nicht offen für weitere Antworten.
M

muril

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

Quaxli

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

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

Guest

Gast
also die zeile mag er gar nicht :
Code:
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

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

Guest

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

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

Guest

Gast
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!

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

Top Contributor
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 :oops: )

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

Guest

Gast
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 ^^
 
G

Gast

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

Quaxli

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

Code:
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);
	}
		

}
 
M

muril

Gast
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 :p
Und weil ich wiedermal vielzu kompliziert dachte und mit derartigen AffineTransformationen noch net gearbeitet hatte, bin ich net aufs zurückdrehen gekommen :p Najo danke!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben