Как я могу наследоваться, установка сглаживания системы для рисования текста к внеэкранным изображениям как колебание делает?

Когда я выполняю свое колебание приложения GUI под Java 6, они автоматически используют мои настроенные субпиксельные настройки сглаживания для всех шрифтов. Результат очень улучшен по стандартным опциям AA.

Но когда я крашу к изображению, я не могу найти способ инициализировать графический контекст для использования конфигурации AA системы. Попытка играть вокруг с различными подсказками AA Java является проигранным делом, потому что никакой субпиксельный метод не будет работать на всех пользователей.

Там какой-либо путь состоит в том, чтобы наследовать системные настройки AA для данного графического контекста вместо того, чтобы иметь необходимость выбрать один и явно установить подсказку? В данный момент я должен использовать УДУШЬЕ AA для предотвращения ужасных результатов, которые стандартный AA дает с мелкими шрифтами. Я попытался ничего не установить для текста AA и не установить любые намеки AA на все.


Обновление 05.01.2010

Я думаю, что придавил это; субпиксель подсказки AA, кажется, только уважают при рисовании непосредственно к графическому контексту AWT; когда я крашу к двойному буферу, отображают его, просто делает стандартный AA; но когда я обхожу изображение двойного буфера субпиксель, AA сделан.

Иначе ответ The_Fire работал бы в JVMs, которые имеют Swing в наличии (но не J2ME JVMs); Обратите внимание, что ответ The_Fire не работает с помощью компонента AWT (использование новой Маркировки () вместо нового JLabel () сбои), по-видимому, потому что FontRenderContext не может быть извлечен, пока компонент не понят к дисплею.


Мой текущий код для получения графического контекста для моего целевого изображения в настоящее время похож на это:

try {
    if((dbImage=dctRoot.createImage(wid,hgt,1))!=null) {            // if createImage returns null or throws an exception the component is not yet displayable
        dbGraphics=(Graphics2D)dbImage.getGraphics();
        if(dctRoot.properties.getBoolean("Antialias",true)) {
            try {
                // set AA on overall
                dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING     ,RenderingHints.VALUE_ANTIALIAS_ON);
                // set text AA to platform/impl default
                dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
                // try to override platform/impl AA with font-specified AA (Java 6+)
                try { dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.class.getField("VALUE_TEXT_ANTIALIAS_GASP").get(null)); } catch(Throwable thr) {;} // yes, ignore exception
                }
            catch(Throwable thr) {
                dctRoot.log.println("Antialiasing not supported on this JVM ("+thr+").");
                dctRoot.setProperty("Antialias","False");           // turn off AA for subsequent painting
                }
            }
        }
    }
catch(Throwable thr) {
    dbImage=null;
    dbGraphics=null;
    }

Код для создания изображения использует базовый компонент AWT, который формирует фон, на котором я делаю все свое рисование - компонентом является Панель, потому что я должен смочь сделать setFocusCycleRoot, таким образом, это играет хорошо с другими компонентами AWT. Создать код изображения следует:

public DctImage createImage(int wid, int hgt, float accpty) {
    GraphicsConfiguration               cfg=awtComponent.getGraphicsConfiguration();
    Image                               img=null;

    if(transparentImages) {
        //y { img=new BufferedImage(wid,hgt,BufferedImage.TYPE_INT_ARGB); }     // NB: J2ME CDC/PP 1.1 does not have the BufferedImage constructors (one day I may discover a way to create a BufferedImage via another API!!)
        try { img=cfg.createCompatibleImage(wid,hgt,Transparency.TRANSLUCENT); }// NB: J2ME CDC/PP 1.1 does not have this API, but prefer to use GraphicsConfiguration over new BufferImage(...)
        catch(NoClassDefFoundError   thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled
        catch(NoSuchMethodError      thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled
        catch(NoSuchFieldError       thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled
        }
    else {
        img=cfg.createCompatibleImage(wid,hgt);
        }

    if(accpty>0 && SET_ACCELERATION_PRIORITY!=null) {
        try { SET_ACCELERATION_PRIORITY.invoke(img,new Object[]{new Float(accpty)}); } catch(Throwable thr) {;}
        }

    return (img==null ? null : new DctImage(img));
    }
11
задан Lawrence Dol 9 July 2014 в 16:22
поделиться

3 ответа

[

]Я обнаружил, что здесь происходит несколько факторов. [

] [

]Во-первых, изображение должно быть создано из базового компонента AWT, и оно должно быть создано без прозрачности:[

] [
cfg.createCompatibleImage(wid,hgt);
] [

]вместо[

] [
cfg.createCompatibleImage(wid,hgt,Transparency.TRANSLUCENT);
] [

]Во-вторых, по каким-то необъяснимым причинам, основная настройка AA, KEY_ANTIALIASING, должна быть выключена, чтобы использовать LCD субпиксельный AA. [

] [

]Наконец, и что наиболее важно, подсказки по рендерингу шрифтов на рабочем столе легко извлекаются с помощью:[

] [
java.awt.Toolkit.getDesktopProperty("awt.font.desktophints")
] [
] [

][]Обновление 2010-01-05[] [

] [

]Повторное тестирование на Java 6.26, похоже, что проблема с необходимостью отключения общей настройки AA для рендеринга текстового AA наконец-то решена (путь к Oracle... после того, как Солнце было всего лишь []несколько лет[] десятью годами позже).[

].
7
ответ дан 3 December 2019 в 08:04
поделиться

Используя Swing, я могу получить правильную текстовую подсказку со сглаживанием типа:

JLabel label = new JLabel();
FontMetrics fm  = label.getFontMetrics( label.getFont() );
Object aaHintValue = fm.getFontRenderContext().getAntiAliasingHint();

В моей системе это возвращает RenderingHits.VALUE_TEXT_ANTIALIAS_LCD_HRGB.

.
5
ответ дан 3 December 2019 в 08:04
поделиться

Подожди, ты выполняешь этот код на Windows JVM? Я думал, что ClearType - это технология Microsoft, которую Swing наследует через некоторый родной код (т.е. недоступный на Linux или других не Microsoft платформах).

Однажды я написал сервлет, который генерировал JPG со шрифтами под псевдонимами, который работал на Debian, и это был код, который я использовал

Font font = new Font("Komix", Font.PLAIN, 8);
Graphics2D g2;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
FontRenderContext  frc = g2.getFontRenderContext();
g2.setFont(font);
g2.setPaint(Color.black);
g2.drawString(sMessage, xOffset, yOffset);

Offhand Я не могу вспомнить, полагается ли какой-либо из этих кодов на Swing (я импортировал javax. Swing и сервлет длиной около 300 строк, так что я, возможно, подумал, что он мне нужен для чего-то другого), быстрая проверка на Google выглядит так, как будто это прямо в пространстве AWT. Надеюсь, это поможет.

1
ответ дан 3 December 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: