Я застрял (за пределами удовольствия) в попытке исправить качество текста с помощью двойной буферизации закадрового изображения. Снимок экрана стоит тысячи слов.
- Уродливый
String
рисуется на закадровом изображении, а затем копируется в аргументGraphics
paintComponent
. - Красивый
String
записывается непосредственно в аргументGraphics
paintComponent
, минуя закадровое изображение.
Оба экземпляра Graphics
(экранный и закадровый) одинаково настроены с точки зрения качества рендеринга, сглаживания и так далее...
Заранее большое спасибо за вашу мудрость.
Далее следует очень простой код:
public class AcceleratedPanel extends JPanel {
private Dimension osd; //offscreen dimension
private BufferedImage osi; //offscreen image
private Graphics osg; //offscreen graphic
public AcceleratedPanel() {
super();
}
@Override
public final void paintComponent(Graphics g) {
super.paintComponent(g);
// --------------------------------------
//OffScreen painting
Graphics2D osg2D = getOffscreenGraphics();
setupGraphics(osg2D);
osg2D.drawString("Offscreen painting", 10, 20);
//Dump offscreen buffer to screen
g.drawImage(osi, 0, 0, this);
// --------------------------------------
// OnScreen painting
Graphics2D gg = (Graphics2D)g;
setupGraphics(gg);
gg.drawString("Direct painting", 10, 35);
}
/*
To make sure same settings are used in different Graphics instances,
a unique setup procedure is used.
*/
private void setupGraphics(Graphics2D g) {
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
}
private Graphics2D getOffscreenGraphics() {
//Graphics Acceleration
Dimension currentDimension = getSize();
if (osi == null || !currentDimension.equals(osd)) {
osi = (BufferedImage)createImage(currentDimension.width, currentDimension.height);
osg = osi.createGraphics();
osd = currentDimension;
}
return (Graphics2D) osg;
}
} //End of mistery
Graphics
был настроен для экранного устройства — он может представлять более высокий DPI, тогда как, напротив, вашBufferedImage
, вероятно, работает между 72-92 (?) DPI — К сожалению, в последний раз Я проверил (это было некоторое время назад), нет простого способа получить DPI экранного устройства (это могло недавно измениться), так что вы можете потратить немного времени, угадывая, какой лучший размер для вашегоBufferedImage
- person MadProgrammer   schedule 19.07.2017