Проблема, с которой я столкнулся, заключается в том, что визуализированное изображение выглядит плохо на дисплеях, на которых масштабирование Windows DPI установлено выше 100 %. Происходит некоторая форма плохого масштабирования.
Целью является Java 11, поэтому теоретически должно быть известно о масштабировании DPI для каждого монитора, судя по тому, что я читал.
Изображение генерируется на лету. Это изображение химической структуры, полученное с помощью инструментария Indigo. Но это не так уж и важно для вопроса, просто объяснение фрагмента кода. Вот текущий код рендеринга:
Код: Выделить всё
public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
Image image = getImage();
if (image == null) {
return;
}
Insets insets = ((Container) c).getInsets();
x = insets.left;
y = insets.top;
GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
GraphicsConfiguration gc = device.getDefaultConfiguration();
AffineTransform transform = gc.getDefaultTransform();
// get cell size and scale for DPI scaling
// Issue: scaleX and scaleY are always 1
int w = (int) ((c.getWidth() - x - insets.right) * transform.getScaleX());
int h = (int) ((c.getHeight() - y - insets.bottom) * transform.getScaleY());
logger.debug("Rendering Chemical Structure image: W: " + w + " H: " + h + " scaleX: " + transform.getScaleX()
+ " scaleY: " + transform.getScaleY());
if (w != width || h != height) {
if (w < 16 || h < 16) {
// 16 pixels is minimum size supported by indigo
return;
}
width = w;
height = h;
indigo.setOption("render-image-size", w, h);
indigo.setOption("image-resolution", 300);
image = renderImage();
setImage(image);
ImageObserver io = getImageObserver();
g.drawImage(image, x, y, w, h, io == null ? c : io);
}
}
private Image renderImage() {
try {
Image image = null;
if (structureData != null) {
if (mol != null) {
if (!mol.hasCoord()) {
mol.layout();
}
byte[] imageData = renderer.renderToBuffer(mol);
ByteArrayInputStream bis = new ByteArrayInputStream(imageData);
image = ImageIO.read(bis);
//image = Toolkit.getDefaultToolkit().createImage(imageData);
if (image == null) {
return null;
}
}
}
return image;
} catch (IOException e) {
logger.catching(e);
return null;
}
}
Я тоже пробовал:
Код: Выделить всё
-Dsun.java2d.uiScale=1
Код: Выделить всё
-Dsun.java2d.uiScale.enabled=true
Я также видел MultiResolutionImage, но предпочитаю просто отображать правильный.
Как я могу заставить код правильно масштабировать изображение для дисплеев с активным масштабированием DPI?>
Мобильная версия