Je suis bloqué (au-delà des limites de l'amusement) en essayant de corriger la qualité du texte avec la double mise en mémoire tampon de l'image hors écran. Screen capture worth a thousand words.Texte misérable lorsque vous dessinez des images hors écran en Java
- Le
String
laid est tiré à une image hors écran, puis copiés sur l'argument deGraphics
paintComponent
. - Le beau
String
est écrit directement à l'argumentGraphics
depaintComponent
, en contournant l'image hors écran.
Les deux instances (Graphics
à l'écran et hors écran) sont configurés de manière identique en termes de qualité de rendu, anticrénelage, et ainsi de suite ...
Merci beaucoup à l'avance pour votre sagesse.
Le code très simple suit:
public class AcceleratedPanel extends JPanel {
private Dimension osd; //offscreen dimension
private BufferedImage osi; //offscreen image
private Graphics osg; //offscreen graphic
public AcceleratedPanel() {
super();
}
@Override
public final void paintComponent(Graphics g) {
super.paintComponent(g);
// --------------------------------------
//OffScreen painting
Graphics2D osg2D = getOffscreenGraphics();
setupGraphics(osg2D);
osg2D.drawString("Offscreen painting", 10, 20);
//Dump offscreen buffer to screen
g.drawImage(osi, 0, 0, this);
// --------------------------------------
// OnScreen painting
Graphics2D gg = (Graphics2D)g;
setupGraphics(gg);
gg.drawString("Direct painting", 10, 35);
}
/*
To make sure same settings are used in different Graphics instances,
a unique setup procedure is used.
*/
private void setupGraphics(Graphics2D g) {
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
}
private Graphics2D getOffscreenGraphics() {
//Graphics Acceleration
Dimension currentDimension = getSize();
if (osi == null || !currentDimension.equals(osd)) {
osi = (BufferedImage)createImage(currentDimension.width, currentDimension.height);
osg = osi.createGraphics();
osd = currentDimension;
}
return (Graphics2D) osg;
}
} //End of mistery
"... au-delà des limites du plaisir". Bienvenue à * travailler *. –
La méthode de peinture "directe" profite du fait que le contexte 'Graphics' a été configuré pour le périphérique d'écran - il peut représenter un DPI plus élevé, alors qu'en revanche, votre' BufferedImage' fonctionne probablement entre 72-92 (?) DPI - Malheureusement, la dernière fois que j'ai vérifié (il y a un moment), il n'y a pas de moyen facile d'obtenir le DPI de l'écran (cela a peut-être changé récemment), donc vous pourriez passer un peu de temps la meilleure taille pour faire votre 'BufferedImage' – MadProgrammer