Я экспериментировал с двумя разными методами рисования одной и той же формы: первое изображение рисуется путем переопределения метода JPanel paintComponent(Graphics g) и использования g.drawOval(..) и т. д. Второе изображение рисуется путем создания буферизованного изображения и рисования на нем с помощью графики буферизованного изображения. Как добиться одинакового качества рендеринга при обоих подходах? Я пробовал использовать много разных советов по рендерингу, но ни один из них не дал такого же качества. Я также пытался повысить резкость с помощью ядра и фильтрации, но все равно не смог.
private void createImage() {
image = new BufferedImage(IMG_SIZE, IMG_SIZE, BufferedImage.TYPE_INT_ARGB);
Graphics2D gr = image.createGraphics();
gr.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gr.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
gr.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
//something along the way
gr.drawOval(.....);
gr.drawLine(.....);
gr.drawOval(.....);
panel.repaint();
gr.dispose();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(backgroundColor);
if (USE_BUFFERED_IMAGE) {
g.drawImage(image, startX, startY, null);
} else {
//something along the way
g.drawOval(.....);
g.drawLine(.....);
g.drawOval(.....);
}
}
Рисование с использованием графики JPanel paintComponent
Рисование с использованием графики Buffered Image, затем рисование в Jpanel с помощью drawimage
ИЗМЕНИТЬ
Я нашел свое решение, получив почти все настройки графики панели и применив их к графике буферизованного изображения. Не используя только одни и те же подсказки рендеринга или минимальные воспроизводимые примеры подходов. Здесь импорт заключается в том, что графика панели масштабирует все на 1,25, а затем масштабирует до оригинала перед отображением на панели.
Вот пример, это не совсем мой код, это просто пример, чтобы дать вам представление-
private void createImages(Paint paint, RenderingHints hints,
AffineTransform transform, Stroke stroke,
Composite composite, GraphicsConfiguration config ){
image = config.createCompatibleImage(IMG_SIZE, IMG_SIZE,
BufferedImage.TYPE_INT_ARGB);
Graphics2D gr = image.createGraphics();
// same options
gr.setPaint(paint);
gr.setRenderingHints(hints);
gr.setTransform(transform);
gr.setStroke(stroke);
gr.setComposite(composite);
//something along the way
gr.drawOval(.....);
gr.drawLine(.....);
gr.drawOval(.....);
panel.repaint();
gr.dispose();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(backgroundColor);
if (USE_BUFFERED_IMAGE) {
Graphics2D g2 = (Graphics2D)g;
createImages(g2.getPaint(), g2.getRenderingHints(),g2.getTransform(),
g2.getStroke(),g2.getComposite(), g2.getDeviceConfiguration());
//scaling down is important because your drawings get scaled to 1.25
// by panels graphics' transformation
g.drawImage(image, startX, startY,(int)(IMG_SIZE*0.8),(int)(IMG_SIZE*0.8), null);
} else {
//something along the way
g.drawOval(.....);
g.drawLine(.....);
g.drawOval(.....);
}
}