Как отобразить ImageIcon из файла изображения в высоком разрешении современных экранов?JAVA

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

Сообщение Anonymous »

Я пытаюсь прочитать значок из файла .png и отобразить его в половинном размере, чтобы воспользоваться преимуществами более высокого разрешения современных экранов. Но ничего из того, что я пытаюсь сделать, не работает.
Вот что я пробовал:
  • На изображении ниже, чтобы создать «32, масштабированное до 16», я вызвал imageIcon.getImage().getScaledInstance(16, 16, Image.SCALE_SMOOTH) Этот метод был написан задолго до изобретения экранов с высоким разрешением и возвращает изображение с низким разрешением. в половинном размере.
  • Чтобы создать «16-пиксельный вариант», я создал MultiResolutionImage с 16-пиксельными и 32-пиксельными вариантами и вызвал multiResImage.getResolutionVariant(16, 16), который запрашивает 16-пиксельный вариант, надеясь, что он уменьшит 32-пиксельный вариант. Он использовал 32-пиксельный вариант, но в полном размере. Это заставляет меня задуматься, для чего нужен этот класс.
  • Чтобы создать «Кнопку половинного размера», я создал подкласс ImageIcon половинного размера и переопределил три метода, используемые для рисования изображения. Частично это сработало. Это было единственное решение, которое рисовало изображение в правильном размере и разрешении, но помещало изображение не в то место. (Код этого класса приведен ниже.)
Так что ничего из этого не сработало. Вы можете скачать минимальный воспроизводимый пример по адресу https://github.com/SwingGuy1024/IconFamilyBug и попробовать это самостоятельно. Вот что получилось:
Изображение

Вот класс ImageIcon половинного размера:
public static class HalfSizeIcon extends ImageIcon {
private static final float scale = 0.5f;

public HalfSizeIcon(ImageIcon icon) {
super(icon.getImage());
if (icon.getDescription() != null) {
setDescription(icon.getDescription());
}
}

@Override
public synchronized void paintIcon(
final Component c,
final Graphics g,
final int x,
final int y) {
Graphics2D g2 = (Graphics2D) g;
AffineTransform savedTransform = g2.getTransform();
g2.scale(scale, scale);
super.paintIcon(c, g2, x, y);
g2.setTransform(savedTransform);
}

@Override
public int getIconWidth() {
return Math.round(scale * (super.getIconWidth()));
}

@Override
public int getIconHeight() {
return Math.round(scale * (super.getIconHeight()));
}
}

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