当前位置: 首页 > 面试题库 >

Java字体渲染

彭阳朔
2023-03-14
问题内容

我一直在尝试增强我用Java编写的GUI系统,以使用亚
像素抗锯齿功能,并且除两个剩余的
异常现象之外,都已经取得了成功。这是我的一个后续从几个星期的其他问题
之前。

第一个问题是将渲染提示KEY_ANTIALIASING设置为
VALUE_ANTIALIAS_ON会导致将KEY_TEXT_ANTIALIASING设置
为LCD(子像素)AA值时被忽略。谁能对此有所启发?目前,我
被迫在渲染文本之前将其设置为VALUE_ANTIALIAS_OFF,并在渲染文本后将其重新打开(以便对其他绘画(例如圆圈等)进行AA处理)。此问题由下面的独立测试程序证明。

第二个问题是我找不到用于查询AA 的基础O / S 设置的方法,因此我不得不做一个比较笨拙的解决方法,即
创建一个Swing JLabel,获取它的FontMetrics,获取它的FontRenderContext,然后获取机管局的提示。除了将Swing包含在
绝对不使用Swing的程序中之外,它还不能运行任何J2ME JVM 的设备上运行。谁能建议一个更好的方法来做到这一点?如果
它需要J5或J6,就可以了,因为当前合并已经需要J6(但
最好只需要J4)。我已经尝试了所有默认设置,并使用AWT组件而不是JLabel。

测试程序

此程序验证要使子像素AA起作用,必须首先禁用常规AA设置。(PS:我写了一个后缓冲区,因为我的底层
GUI确实在写,所以我想在一个等效的上下文中进行测试)。

import java.awt.*;
import java.awt.event.*;

public class AwtTestFrame1b extends Panel {

private final Font                      font=new Font(Font.SANS_SERIF, Font.PLAIN, 16);
private final int                       line=25;

AwtTestFrame1b() {
    setBackground(SystemColor.control);
    }

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;

    int                                 py=0;

    py=paintText(g2d,py,null                                        ,false);
    py=paintText(g2d,py,null                                        ,true );
    py+=line;

    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF     ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON      ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP    ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
    py+=line;

    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF     ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON      ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP    ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,true );
    py+=line;
    }

private int paintText(Graphics2D g2d, int py, Object val, boolean aa) {
    Graphics2D                          dgc=g2d;
    char[]                              txt=("The quick brown fox jumped over the lazy dog ("+val+", General AA: "+aa+")").toCharArray();
    Image                               img=null;

    GraphicsConfiguration cfg=getGraphicsConfiguration();
    img=cfg.createCompatibleImage(getWidth(),line);
    dgc=(Graphics2D)img.getGraphics();
    dgc.setColor(getBackground());
    dgc.fillRect(0,0,getWidth(),line);
    dgc.setColor(g2d.getColor());

    if(aa       ) { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON ); }
    else          { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); }
    if(val!=null) { dgc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,val); }
    dgc.setFont(font);

    dgc.drawChars(txt,0,txt.length,10,line-5);
    g2d.drawImage(img,  0,py,  null);

    dgc.dispose();
    img.flush();

    return (py+line);
    }

public static void main(String[] args) {
    Frame                               wnd=new Frame("AWT Antialiased Text Sample");

    wnd.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
            }
        });
    wnd.add(new AwtTestFrame1b());
    wnd.setSize(new Dimension(1000, 600));
    wnd.setVisible(true);
    }

}

问题答案:

是AWT桌面属性 的任何帮助吗?特别是
“ awt.font.desktophints”-这些包含本机组件使用的AA提示,但可以应用于所需的任何Graphics2D。

最近阅读了FilthyRich Clients中AA部分的内容,这只是黑暗中的一枪。

使用看起来像这样:

String str = "A quick brown fox jumps over the lazy dog";
Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Graphics2D g2d = (Graphics2D)g;

if(desktopHints != null) {
    g2d.addRenderingHints(desktopHints);
}

g2d.drawString(str, someX, someY);

使用
这些提示,并且在我的机器上没有其他调用,我能够获得与LCD HRGB模式相同的结果(使用示例类以及drawChars和drawImage,为简单起见,仅键入drawString)。

我不确定这需要什么版本的Java,如果这正是您要寻找
的……



 类似资料:
  • 我试图使用opengl在lwjgl显示器上显示自定义字体的文本。目前,我正在使用自定义位图字体类从png文件加载字体,并以与tileset相同的方式显示它们。它工作正常,但当我将文本绘制到屏幕上时,字符之间的间距完全不同,因为字母M比字母i宽得多,并且所有字符的宽度都不同。有没有办法检测每个字符的宽度?或者是否有任何特定于lwjgl字体的库?有一种方法可以使用slick2d来实现,但加载整个库只是

  • 字体渲染引擎的工作主要是字体文件操作和文字渲染,LCUI 将其抽象成了 LCUI_FontEngine 接口,使得 LCUI 的字体渲染引擎可被切换和扩展。 目前基于该接口实现的引擎有内置引擎和 FreeType 引擎,接下来我们再深入了解它们。 内置引擎 内置引擎是 LCUI 初始化的第一个引擎,它主要用于在无其它可用引擎的情况下加载预置的字体位图数据,以确保界面中的文字能够被渲染出来。 内置引

  • 安卓字体渲染器 原文:android font renderer 译文出自 : 开发技术前线 www.devtf.cn 译者:7heaven 校对者: 状态:翻译完成 任何一个有几年的客户端应用开发经验的开发者都会知道文本渲染有多复杂。至少我在2010年开始写libhwui(基于OpenGL的安卓2D绘制API)之前是这么认为的。在开始写libhwui后,我意识到如果试图用GPU来渲染文本会使文本

  • 在控制台上获取以下第一行: 35026:1978749]CoreText注意:客户端请求的名称“.SFNS-Regular”,它将获得Times-Roman而不是预期的字体。所有系统UI字体访问都应通过适当的API,如CTFontCreateUIFontForLanguage()或[NSFont systemFontOfSize:]。2021 06月09日00:00:46.808 java[350

  • 我使用的是ATOM,我试图在代码中改变字体家族,但有些东西没有改变。 首先我这样做:href=“https://fonts.googleapis.com/css?family=roboto&display=swap”rel=“stylesheet”type=“text/css”

  • 本文向大家介绍说说页面中字体渲染规则是怎样的?会有哪些因素影响字体的渲染?相关面试题,主要包含被问及说说页面中字体渲染规则是怎样的?会有哪些因素影响字体的渲染?时的应答技巧和注意事项,需要的朋友参考一下 字体渲染: 1.解码,根据web服务器返回的(或者本地网页本身的)content-type charset等信息确定编码,将网页解码成Unicode字符流; 2.分段,把文本分为由不同语言(中文、