Java - lepsze wygładzanie czcionek

0

Witam.

Szukam jakiegoś sposobu na ulepszenie wygładzania czcionek w Javie. Piszę sobie edytor tekstowy. Główne pole tekstowe to kontrolka JTextPane.
Dla porównania obrazek:

Po lewej stronie zrzut z mojego programu. Po prawej Adobe Story w którym (tak jak w innych Flashowych aplikacjach) jest o wiele lepsze wygładzanie, dzięki czemu nawet czcionki w większych rozmiarach wyglądają super, żadnej pikselozy. Chciałbym coś takiego osiągnąć w Javie.

Znalazłem w internecie taki fragment kodu i wrzuciłem go do swojego kodu programu:

@Override
public void paint(Graphics g)
{
	Graphics2D g2 = (Graphics2D)g;
	g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
	g2.setRenderingHint((RenderingHints.KEY_RENDERING), RenderingHints.VALUE_RENDER_SPEED);
	super.paint(g2);
}

Niestety to nie rozwiązuje mojego problemu (a może nie wiem jak tego używać) a próbowałem zmieniać wartości na inne dostępne. W każdym razie, gdy wtedy skompiluję program JTextPane jest niewidoczne, muszę zaznaczyć tekst żeby znowu pole tekstowe było widoczne. Czyli coś jednak chce działać, ale nie do końca bo lepszego wygładzania nie widzę.

Znacie może jakiś sprawdzony sposób?

I tak na marginesie: czy łatwiej osiągnąć takie efekty w C# w kontrolce RichTextBox?

0

Proponuję chociaż poczytać javadoca.

VALUE_RENDER_SPEED
Rendering hint value -- rendering algorithms are chosen with a preference for output speed.

Wybrałeś preferencję dla szybkości, a nie dla jakości. To po pierwsze.

Po drugie poeksperymentuj z wartościami:

VALUE_TEXT_ANTIALIAS_LCD_HRGB
VALUE_TEXT_ANTIALIAS_LCD_HBGR
VALUE_TEXT_ANTIALIAS_LCD_VRGB
VALUE_TEXT_ANTIALIAS_LCD_VBGR

H/V oznacza czy subpiksele są ułożone poziomo czy pionowo.
RGB/BGR oznacza w jakiej kolejności są ułożone subpiksele.
Wybierz tak jak masz na swoim monitorze.

0

Dzięki za odpowiedź.

No własnie przeglądałem oficjalną dokumentację: http://docs.oracle.com/javase/tutorial/2d/text/renderinghints.html

Ja wiem, że zamiast VALUE_RENDER_SPEED ma być VALUE_RENDER_QUALITY, po prostu sprawdzałem każdą dostępną opcję. Co do wartości HRGB i pozostałych, niestety też nie ma rezultatów. Program się kompiluje, ale pole tekstowe nie jest aktywne dopóki nie zaznaczę tekstu. Poza tym, mimo że program się uruchamia, dostaję błąd:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: LCD VRGB antialiasing text mode is not compatible with Global rendering quality key. Nie wiem czy się dobrze zrozumieliśmy, ogólnie wygładzanie jako takie w JTextPane jest, ale chodzi mi żeby uzyskać efekt większego wygładzenia, tak jak na obrazku, co dobrze widać w czcionkach w większym rozmiarze - czcionka wydaje się grubsza bo zamiast kolorowego wygładzenia (widać dopiero w powiększeniu) jest odcień szarości, co odrobinę pogrubia czcionkę i nadaje jej czytelności.

Tutaj jest kod jak to mniej więcej ogólnie wygląda:

import java.awt.*;
import javax.swing.*;
public class Programik extends JFrame
{
	private JPanel;
	private JPanel;
	private JTextPane;
	public Programik()
	{
		super();
		panelGlowny = (JPanel)this.getContentPane();
		getContentPane().setLayout(new GridBagLayout());
		panelText = new JPanel();
		textPane = new JTextPane();
		textPane.setFont(new Font("Monospaced", Font.PLAIN, 18));
		textPane.setText("abcdefghijklmnopqrstuvwxyz");
		panelText.setBorder(BorderFactory.createMatteBorder(
			10, 10, 10, 10, new Color(255,255,255)));
        
		panelText.setLayout(new BoxLayout(panelText, BoxLayout.X_AXIS));
		panelText.add(textPane, 0);
        
		panelGlowny.setLayout(new BorderLayout(0, 0));
		panelGlowny.add(panelText, BorderLayout.CENTER);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		this.setSize(new Dimension(500, 300));
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	@Override
	public void paint(Graphics g)
	{
		Graphics2D g2 = (Graphics2D)g;
		g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g2.setRenderingHint((RenderingHints.KEY_RENDERING), RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB);
	}
	public static void main(String[] args)
	{
		new Programik();
	}
}

Wspomniałeś żebym wybrał wartość taką jak mam na monitorze. To znaczy że wygładzanie będzie widoczne tylko na moim komputerze?

0

Wspomniałeś żebym wybrał wartość taką jak mam na monitorze. To znaczy że wygładzanie będzie widoczne tylko na moim komputerze?

Wygładzanie podpikselowe zależy od układu subpikseli na monitorze, więc żeby go użyć należy znać tą kolejność.

Nie wiem czy się dobrze zrozumieliśmy, ogólnie wygładzanie jako takie w JTextPane jest, ale chodzi mi żeby uzyskać efekt większego wygładzenia, tak jak na obrazku, co dobrze widać w czcionkach w większym rozmiarze - czcionka wydaje się grubsza bo zamiast kolorowego wygładzenia (widać dopiero w powiększeniu) jest odcień szarości, co odrobinę pogrubia czcionkę i nadaje jej czytelności.

Czcionki TrueType można renderować na setki sposobów, te różnice wynikają np z http://en.wikipedia.org/wiki/Font_hinting . Te obrazki co podałeś wyglądają tak jakby ten tekst po lewej miał wygładzanie podpikselowe oraz hinting włączone, natomiast tekst po prawej nie miał ani jednego ani drugiego. Hinting i wygładzanie podpikselowe poprawiają czytelność małych rozmiarów czcionek. Natomiast przy większych rozmiarach możesz po prostu popróbować z grubością czcionki jeśli wydają ci się za cienkie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1