Hihu,
Folgender Entwurf schwebt mir vor:
Ich übergebe einer Klasse, die von JPanel erbt,
eine Hintergrundbild und das zu zommende Bild in höchster Auflösung,
sowie Startpunkte (zur Vereinfachung zurzeit konstant).
Hab mir schon einiges so Double-Buffering und Zeichnen mit Swing durchgelesen ..
irgendwas mache ich aber falsch ...
Aufgrund dieses Thread hier;
http://www.java-forum.org/awt-swing-swt/80077-bilder-skaliert-zeichnen.html
habe ich mich entschieden alle Bilder erst zu rendern,
anschließend zu zoomen ...
Wenn das Bild gezommt ist und ich die Größe des Fensters minimiere oder
ein anderes davor schiebe gibt es keine Probleme ...
Beim zoomen flackert allerdings mein Bild ..
Ich dachte Swing hätte einen automatischen Buffer?
(BufferStrategy)
Wie verhindere ich ein Flackern ?
Kann ich getGraphics() in myZoom irgendwie vermeiden?
[HIGHLIGHT="Java"]public class ZoomImage3 extends JPanel
{
//DATENFELDER
private int startX;
private int startY;
private BufferedImage bakImg;
private BufferedImage zoomImg;
private ImageProducer2 imageProducer;
private int tmpWidth;
private int tmpHeight;
private int speed = Image.SCALE_REPLICATE;
private int pixel = 4;
private Image currentImage;
//for Double-Buffering
private Image[] tmpImg;
private Graphics tmpG;
public ZoomImage3(ImageProducer2 imageProducer)
{
this.imageProducer = imageProducer;
}
public void setBakImg(BufferedImage bakImg)
{
this.bakImg = bakImg;
this.tmpImg = new Image[90];
}
public void setImg(BufferedImage zoomImg)
{
setPreferredSize(new Dimension(600,600));
this.zoomImg = zoomImg;
startX = 20;
startY = 20;
tmpWidth = 10;
tmpHeight = 10;
currentImage = zoomImg.getScaledInstance(tmpWidth, tmpHeight, speed);
}
public void zoomImage()
{
myZoom();
}
/**
* modifizierte "paint"-Methode,
* zeichnet das jeweiliges Hintergrundbild und aktuelle Bild.
*/
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(this.bakImg, 0, 0, this);
g.drawImage(this.currentImage, startX, startY, this);
}
public void myZoom()
{
tmpG = this.getGraphics();
speed = Image.SCALE_FAST;
for(int i = 0; i < tmpImg.length ; i++)
{
tmpImg = zoomImg.getScaledInstance(tmpWidth, tmpHeight, speed);
tmpHeight += pixel;
tmpWidth += pixel;
}
for(int i = 0; i < tmpImg.length; i++)
{
currentImage = tmpImg;
paintComponent(tmpG);
}
speed = Image.SCALE_AREA_AVERAGING;
paintComponent(tmpG);
}
public void updateImage(Graphics g)
{
paintComponent(g);
}
}//class close[/HIGHLIGHT]
PS.: Wie lautet der tag für die Javaformatierung hier im Forum ?
Folgender Entwurf schwebt mir vor:
Ich übergebe einer Klasse, die von JPanel erbt,
eine Hintergrundbild und das zu zommende Bild in höchster Auflösung,
sowie Startpunkte (zur Vereinfachung zurzeit konstant).
Hab mir schon einiges so Double-Buffering und Zeichnen mit Swing durchgelesen ..
irgendwas mache ich aber falsch ...
Aufgrund dieses Thread hier;
http://www.java-forum.org/awt-swing-swt/80077-bilder-skaliert-zeichnen.html
habe ich mich entschieden alle Bilder erst zu rendern,
anschließend zu zoomen ...
Wenn das Bild gezommt ist und ich die Größe des Fensters minimiere oder
ein anderes davor schiebe gibt es keine Probleme ...
Beim zoomen flackert allerdings mein Bild ..
Ich dachte Swing hätte einen automatischen Buffer?
(BufferStrategy)
Wie verhindere ich ein Flackern ?
Kann ich getGraphics() in myZoom irgendwie vermeiden?
[HIGHLIGHT="Java"]public class ZoomImage3 extends JPanel
{
//DATENFELDER
private int startX;
private int startY;
private BufferedImage bakImg;
private BufferedImage zoomImg;
private ImageProducer2 imageProducer;
private int tmpWidth;
private int tmpHeight;
private int speed = Image.SCALE_REPLICATE;
private int pixel = 4;
private Image currentImage;
//for Double-Buffering
private Image[] tmpImg;
private Graphics tmpG;
public ZoomImage3(ImageProducer2 imageProducer)
{
this.imageProducer = imageProducer;
}
public void setBakImg(BufferedImage bakImg)
{
this.bakImg = bakImg;
this.tmpImg = new Image[90];
}
public void setImg(BufferedImage zoomImg)
{
setPreferredSize(new Dimension(600,600));
this.zoomImg = zoomImg;
startX = 20;
startY = 20;
tmpWidth = 10;
tmpHeight = 10;
currentImage = zoomImg.getScaledInstance(tmpWidth, tmpHeight, speed);
}
public void zoomImage()
{
myZoom();
}
/**
* modifizierte "paint"-Methode,
* zeichnet das jeweiliges Hintergrundbild und aktuelle Bild.
*/
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(this.bakImg, 0, 0, this);
g.drawImage(this.currentImage, startX, startY, this);
}
public void myZoom()
{
tmpG = this.getGraphics();
speed = Image.SCALE_FAST;
for(int i = 0; i < tmpImg.length ; i++)
{
tmpImg = zoomImg.getScaledInstance(tmpWidth, tmpHeight, speed);
tmpHeight += pixel;
tmpWidth += pixel;
}
for(int i = 0; i < tmpImg.length; i++)
{
currentImage = tmpImg;
paintComponent(tmpG);
}
speed = Image.SCALE_AREA_AVERAGING;
paintComponent(tmpG);
}
public void updateImage(Graphics g)
{
paintComponent(g);
}
}//class close[/HIGHLIGHT]
PS.: Wie lautet der tag für die Javaformatierung hier im Forum ?
Code:
sieht nicht so schön aus ...
Zuletzt bearbeitet: