1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
@SuppressWarnings("serial")
public class DoubleBufferingSoftware extends Frame {
/**
* Effectue une homothétie de l'image.
*
* @param bi
* l'image.
* @param scaleValue
* la valeur de l'homothétie.
* @return une image réduite ou agrandie.
*
*/
public static BufferedImage scale(BufferedImage bi, double scaleValue) {
AffineTransform tx = new AffineTransform();
tx.scale(scaleValue, scaleValue);
AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_BILINEAR);
BufferedImage biNew = new BufferedImage(
(int) (bi.getWidth() * scaleValue),
(int) (bi.getHeight() * scaleValue), bi.getType());
return op.filter(bi, biNew);
}
// boucle d'affichage
RenderingThread renderingThread = new RenderingThread();
// buffer mémoire (2eme buffer)
Graphics buffer;
// image mémoire correspondante au buffer
Image image;
int x = 0; // coordonnée x de l'affichage
public DoubleBufferingSoftware() {
// affichage
setSize(400, 400);
setVisible(true);
// on démarre la bouche d'affichage
renderingThread.start();
}
public void update(Graphics g) {
paint(g);
}
public void paint() {
// création du buffer s'il n'existe pas
if (buffer == null) {
// buffer = image.getGraphics();
image = createImage(400, 400);
// Pour l'optimisation on crée une BufferedImage compatible avec le
// contexte graphique de l'OS
GraphicsConfiguration gc = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration();
BufferedImage bi = gc.createCompatibleImage(image.getWidth(null),
image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
}
// on dessine sur le buffer mémoire
buffer.setColor(Color.white);
buffer.fillRect(0, 0, 400, 400);
buffer.setColor(Color.black);
buffer.fillRect(150, 150, 100, 100);
BufferedImage bi = null;
// On dessine l'Image initiale sur la BufferedImage
Graphics g = bi.createGraphics();
Image im = null;
g.drawImage(im, 0, 0, this);
g.dispose();
// On scale l'image
bi = scale(bi, 0.8);
}
class RenderingThread extends Thread {
/**
* Ce thread appelle le rafraichissement de notre fenêtre toutes les 10
* milli-secondes
*/
public void run() {
while (true) {
try {
repaint();
sleep(10);
} catch (Exception e) {
}
}
}
}
public static void main(String[] args) {
new DoubleBufferingSoftware();
}
} |
Partager