Как бороться с масштабированием Windows DPI для изображений?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как бороться с масштабированием Windows DPI для изображений?

Сообщение Anonymous »

Приложение представляет собой приложение Swing с графическим интерфейсом, отображающее JTable. Данные загружаются из файла. Первый столбец — это изображение, отображаемое «на лету» из данных в файле. В целом это работает. Это старое приложение, изначально созданное для Java 7, которое я обновляю.
Проблема, с которой я столкнулся, заключается в том, что визуализированное изображение выглядит плохо на дисплеях, на которых масштабирование 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;
}
}
В исходном коде не было всей этой графической части. Согласно исследованиям, это было мое дополнение, и да, я признаю это, AI. Объясняет, почему я не люблю искусственный интеллект: он просто не работает, а изображения все равно каким-то образом масштабируются.
Я тоже пробовал:

Код: Выделить всё

-Dsun.java2d.uiScale=1
или

Код: Выделить всё

-Dsun.java2d.uiScale.enabled=true
Но оба не имеют никакого эффекта, но также дают рекомендации по устранению этой проблемы.
Я также видел MultiResolutionImage, но предпочитаю просто отображать правильный.
Как я могу заставить код правильно масштабировать изображение для дисплеев с активным масштабированием DPI?>
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»