Как сделать так, чтобы изображение покрывало как можно больше места на экране, не теряя пропорций в Java? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть изображение, которое я хочу сделать максимально большим без потери пропорций. Я также хочу, чтобы он работал на разных размерах экрана. Я использую следующий код, который не сохраняет пропорции:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double screen_width = screenSize.getWidth();
double screen_height = screenSize.getHeight();

Image img = ImageIO.read(<PATH_TO_IMAGE>);
img = img.getScaledInstance((int)screen_width, (int)screen_height, Image.SCALE_SMOOTH);

Есть ли способ изменить размер изображения при сохранении пропорций и при этом занять как можно больше места на экране.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Здесь у вас есть два варианта: держать изображение целиком, но, возможно, оставляя незанятым много места, или закрывать весь экран, но, возможно, увеличивая часть изображения, таким образом, невидимым.

В обоих случаях для сохранения пропорций вам необходимо масштабировать с одним фактором.

дело а)

BufferedImage img=ImageIO.read(new File(....));
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double screen_width = screenSize.getWidth();
double screen_height = screenSize.getHeight();
double scalex=screen_width/img.getWidth(), scaley=screen_height/img.getHeight();
double scale=Math.min(scalex, scaley);
int w=(int)(scale*img.getWidth()), h=(int)(scale*img.getHeight());
BufferedImage img2=new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
img2.getGraphics().drawImage(img, 0, 0, w, h, null);

дело б)

BufferedImage img=ImageIO.read(new File(....));
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double screen_width = screenSize.getWidth();
double screen_height = screenSize.getHeight();
double scalex=screen_width/img.getWidth(), scaley=screen_height/img.getHeight();
double scale=Math.max(scalex, scaley);
int w=(int)(scale*img.getWidth()), h=(int)(scale*img.getHeight());
BufferedImage img2=new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
img2.getGraphics().drawImage(img, 0, 0, w, h, null);
0 голосов
/ 29 августа 2018

Если вы используете Swing, вы можете использовать Stretch Icon . С StretchIcon вы можете настроить его на:

  1. заполнить все доступное пространство или
  2. Сохраняйте пропорции изображения и максимально увеличивайте масштаб.

Так вы бы:

  1. создайте StretchIcon с вашим изображением
  2. добавить Icon к JLabel
  3. добавьте метку к BorderLayout.CENTER вашего JFrame

Теперь, когда размер рамки изменяется, иконка автоматически изменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...