7
votes

Java2D graphiques anti-aliased

Je suis nouveau à Java et essayez d'utiliser des graphiques Java2D pour créer une image. Mais la sortie vient comme anti-aliasée. J'ai essayé de nombreuses façons de le corriger mais ne fonctionne pas. Les personnages sont déformés ou déchiquetés.

public BufferedImage createNameOnButton(String label) {
    int messageWidth = 0;
    Font font = new Font("Arial", Font.PLAIN, 11);

    BufferedImage bi = new BufferedImage(
        10, 10, BufferedImage.TYPE_INT_RGB);

    Graphics2D g2d = (Graphics2D) bi.getGraphics();
    g2d.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(
        RenderingHints.KEY_TEXT_ANTIALIASING,
        RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g2d.setRenderingHint(
        RenderingHints.KEY_FRACTIONALMETRICS,
        RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    g2d.setFont(font);

    bi = g2d.getDeviceConfiguration()
        .createCompatibleImage(500, 30, Transparency.BITMASK);
    FontMetrics fm = bi.getGraphics().getFontMetrics(font);
    int messageHeight = fm.getHeight() - fm.getDescent();
    for (char ch : label.toCharArray()) {
        messageWidth += fm.charWidth(ch);
    }

    bi = bi.getSubimage(50, 0, messageWidth + 10, fm.getHeight());
    Graphics g = bi.getGraphics();
    g.setColor(Color.black);
    AttributedString as = new AttributedString(label);
    as.addAttribute(TextAttribute.FONT, font);
    g.drawString(as.getIterator(), 5, messageHeight);
    g2d.dispose();
    g.dispose();
    return bi;
}


4 commentaires

Qu'est-ce que vous créez d'abord une image 10x10? Votre code est vraiment convolué pour ce qu'il est censé faire.


Je ne suis pas complètement sûr que je comprenne. De Yor Question, je comprends que vous ne voulez pas que les personnages soient antialiasés. Mais en lisant le code, ce n'est pas étonnant, car cela indique Antialias_on partout. Pourriez-vous expliquer?


Merci d'avoir déclaré que - j'ai testé le code avec antialias_off, mais il existe des personnages qui sont toujours utilisés comme anti-aliasés (pas tous les caractères) comme, la verticale '\' de N, 'A', 'V', 'E', Y ',' O '- Fondamentalement, les bords de caractères ne sont pas lisses. Y a-t-il autre chose que j'ai?


Aussi, comme mentionné ci-dessous - mon exigence est d'écrire une fonction qui renvoie une bufferedimage contenant un texte de modèle "délivre-moi à ". La phrase "me livrait à" devrait être en couleur noire alors que "" qui est collectée dans le débit doit être en couleur bleue. Pouvez-vous s'il vous plaît fournir des intrants sur le même?


3 Réponses :


7
votes

AS TRATROH mentionné, il est plus que probable dû à xxx

à la place, cela devrait être xxx


2 commentaires

Merci d'avoir déclaré que - j'ai testé le code avec antialias_off, mais certains personnages sont toujours comme anti-aliasés (pas tous les caractères) comme, la verticale '\' de N, 'A', 'V', 'E' ' Y ',' O '- Fondamentalement, les bords de caractères ne sont pas lisses. Y a-t-il autre chose que j'ai?


Vous semblez ne pas comprendre quels moyens anti-aliasing. Anti-aliased = lisse.



12
votes

12 commentaires

Merci pour le programme exemple. Mon exigence est d'écrire une fonction qui renvoie une bufferedimage contenant un texte de modèle "me livrer à ". La phrase "me livrait à" devrait être en couleur noire alors que "" qui est collectée dans le débit doit être en couleur bleue. Pouvez-vous s'il vous plaît fournir des intrants sur le même?


J'ai également oublié d'ajouter que puisqu'il doit être placé sur un bouton, la taille de l'image doit être de largeur et de hauteur spécifique. J'ai essayé le programme d'échantillon, mais l'image rendue est complètement noire et n'a pas pu voir le texte écrit. Veuillez noter que je suis complètement nouveau dans Java.


Juste pour ajouter - j'ai eu l'image mais j'ai besoin de stocker et d'afficher la même chose que dans un fichier. Alors, comment puis-je écrire ce qui est affiché via une méthode d'affichage () dans un fichier.


@Prakash: J'utiliserais imageio.write () pour enregistrer le bufferedimage . Vous pouvez appeler setColor () au besoin pour chaque ligne.


Merci, mais la méthode SetColor () réglait l'image complète comme vert et non la couleur du texte. J'ai besoin d'imprimer le texte en couleur noire et en arrière-plan comme blanc / gris.


Une chose, veuillez noter que pour la sortie, je ne peux pas utiliser de jframe ni utiliser la méthode d'affichage ()


Puisque l'image doit être accessible via une URL Jframe ou toute fenêtre d'application ne peut pas être utilisée pour rendre


Public Bufferedimage CreeenameonButton (étiquette de cordes, décoratif à cordes) {polices de police = nouvelle police ("arial", font.bold, 11); Fontrendercontext frc = nouveau fontrenderercontext (null, vrai, vrai); Textlayout Layout = Nouveau TextLayout (étiquette, police, frc); Rectangle r = layout.getpixelbounds (null, 0, 0); bi = nouveau bufferedimage (R.Width + 5, R.Height, transparence.bitmask); Graphiques2d g2d = (graphiques2d) bi.getGraphics (); g2d.setcolor (couleur.black); Layout.draw (G2D, 0, -R.Y); g2d.drawimage (bi, 0, 0, null); g2d.dispose (); Retour bi;} L'image produite est noire. Réglage de la couleur du texte / de l'arrière-plan sans chance.


@Prakash: transparence.bitmask est un type de bufferedImage valide , mais uniquement par coïncidence. Il n'est pas nécessaire de copier l'image sur elle-même avec g2d.drawimage (BI, 0, 0, null) .


J'ai essayé de supprimer l'option [copier l'image à elle-même] mais le résultat n'est toujours pas atteint.


@Prakash: J'ai mis à jour mon exemple et SetColor () apparaît pour modifier la couleur du texte. Je ne vois pas où votre code va mal. Veuillez modifier votre question, car le code dans les commentaires est presque illisible.


Je n'ai pas pu modifier le code et lancer un nouveau thread lié au même problème - Stackoverflow.com/Questtions/4316815/... . Veuillez consulter la description détaillée et fournir la résolution requise. Comme mentionné, veuillez lire à travers les descriptifs et fournir des solutions.



2
votes

J'ai trouvé que juste Cette ligne fait le truc: xxx

Après cela, il suffit d'utiliser Cordon () .


0 commentaires