【问题标题】:Graphics2d drawString not working with colored fontsGraphics2d drawString 不适用于彩色字体
【发布时间】:2017-10-03 10:57:46
【问题描述】:

我正在尝试在摆动对象(jLabel 等)中显示表情符号,所以为了做到这一点,我使用 this library 和以下类,以便表情符号仅显示

jLabel.setIcon(new EmojiIcon(":poop:"));

这适用于所有支持表情符号的字体,除了彩色字体(即EmojiOneNoto Color Emoji

单色表情符号的意义何在?

public class EmojiIcon implements Icon {
    private Font font;
    private final static int DEFAULT_SIZE = 32;
    private int              width        = DEFAULT_SIZE;
    private int              height       = DEFAULT_SIZE;

    private String emoji;

    public EmojiIcon (String iconString){
        this.emoji = EmojiParser.parseToUnicode(iconString);
        setFont("emojione-android");
        recalculateIconWidth(emoji);
    }

    public void setFont(String strFont){
        try {
            font = Font.createFont(Font.TRUETYPE_FONT, new File("fonts/"+strFont+".ttf")).deriveFont(48f);
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void recalculateIconWidth( String iconString ){
        FontRenderContext frc = new FontRenderContext( null, true, true );
        Rectangle2D bounds = font.getStringBounds(iconString, frc );
        width = (int) bounds.getWidth();
        height = (int) bounds.getHeight();
    }

    @Override
    public void paintIcon( Component c, Graphics g, int x, int y ){
        Graphics2D g2d = (Graphics2D) g;

        g2d.setFont( font );
        g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
        g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );

        g2d.drawString( emoji, 0, height );
    }
}

我在网上寻找字体是否合法,所以我发现here 它没有标准化(至少对于 .ttf 字体)。 有解决方法吗?我真的很想用EmojiOne font

【问题讨论】:

  • 您好!你成功了吗?

标签: java fonts graphics2d emoji emojione


【解决方案1】:

这部分用于加载字体:

            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, Thread.currentThread().getContextClassLoader().getResourceAsStream("path/milibus-rg.ttf")));

这个用于绘制文本:

    public static BufferedImage textToImage(String text, Font font, int bottomPadding, Color color, BufferedImage background) {
    int width = background.getGraphics().getFontMetrics(font).stringWidth(text);
    int height = background.getGraphics().getFontMetrics(font).getHeight();
    BufferedImage bufferedImage = new BufferedImage(width, height, TYPE_4BYTE_ABGR);
    Graphics2D graphics = bufferedImage.createGraphics();
    graphics.setBackground(new Color(0f, 0f, 0f, .0f)); //transparent
    graphics.setColor(color);
    graphics.setFont(font);
    graphics.drawString(text, 0, height - bottomPadding);
    graphics.dispose();
    return bufferedImage;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多