Comment créer des images haute définition personnalisées en Java


Je crée des images en Java sur lesquelles des polices sont écrites avec un arrière-plan transparent. Je fais les polices de différentes couleurs et aussi différents types de styles de police donc j'ai besoin que le programme soit dynamique. Le problème est que j'utilise Graphics2D et que j'écris sur une image tamponnée à l'aide de g2d.drawString() et que les images ne sont pas près de la définition que je recherche. J'ai essayé de créer de grandes images avec de grandes tailles de police, puis de réduire l'échelle, mais cela ne fonctionne pas non plus. J'ai aussi mis tous les RenderingHints possibles à la plus haute définition. Je voudrais que la densité de pixels soit suffisamment élevée pour qu'il n'y ait pas beaucoup de différence si vous la comparez avec du texte régulier sur un écran retina. Grâce.

Author: HaydenKai, 2015-04-29

1 answers

Pour avoir des images de qualité "retina" en Java, vous devez créer et rendre votre BufferedImage à 2 fois la taille normale dans les deux dimensions (cela rendra l'image 4 fois plus grande, ce que je pense est ce que signifie @MadProgrammer).

Ensuite, vous devez ne pas sous-échantillonner (ou "mettre à l'échelle") l'image en Java, mais conserver le BufferedImage en taille réelle et dessiner uniquement l'image en demi-taille sur une instance Graphics2D native. L'objet Graphics passé aux méthodes paint() ou paintComponent() d'un AWT ou Swing le composant est normalement correct (alors que celui de BufferedImage.get/createGraphics() ne l'est pas).

J'ai utilisé du code comme celui-ci avec succès:

@Override
public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    AffineTransform xform = AffineTransform.getScaleInstance(.5, .5);
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2.drawImage(image, xform, null); // image being @2x or "retina" size
}

Cependant, notez que le rendu de police sur un ordinateur moderne utilise "anticrénelage de sous-pixels" ou "rendu de sous-pixels", qui est spécifique au périphérique d'écran vers lequel vous effectuez le rendu (voir le lien, mais fondamentalement, le motif RVB ou la "disposition" diffère d'un périphérique à l'autre). Cela signifie qu'un BufferedImage ne peut généralement pas utiliser le rendu des sous-pixels, et donc les polices auront l'air moins croustillant. Si vous effectuez un rendu sur un seul écran LCD, vous pourrez peut-être spécifier l'un des RenderingHints.TEXT_ANTIALIAS_LCD_* rendu des conseils pour de meilleurs résultats.

 2
Author: haraldK, 2017-08-28 12:49:41