Размер файла Java ImageIcon

Я загрузил картинку в свой графический интерфейс, который отображается на JLabel. Размер метки установлен только 100 100, а изображение намного больше, поэтому, когда я загружаю его в ярлык, он расширяется.

Есть ли способ сделать это с помощью автоматического изменения размера метки?

Ниже показан прослушиватель действий для Upload Picture JButton

class UploadHandler implements ActionListener 
{
    public void actionPerformed(ActionEvent e)
    {
        int returnVal = fc.showOpenDialog(frame2);
        file = fc.getSelectedFile();
        pathname = file.getPath();
        icon = new ImageIcon(pathname);
        lblDisPic.setIcon(icon);    
    }
}

btnUpload = new JButton("Upload Picture");
lblDisPic = new JLabel();
lblDisPic.setBorder(raisedetched);
lblDisPic.setPreferredSize(d); 

btnUpload.addActionListener(new UploadHandler());

Ответы

Ответ 1

Для примера кода один подход заключается в изменении размера изображения для отображения на JLabel до вызова метода setIcon.

Одним из способов может быть изменение метода actionPerformed, поэтому изображение будет загружено из указанного файла, используя метод ImageIO.read для чтения изображения, а затем изменения размера изображения до создания ImageIcon.

Image img = ImageIO.read(fc.getSelectedFile());

Затем загруженное изображение может быть изменено до размера JLabel, используя Image.getScaledInstance.

Image resizedImage = 
    img.getScaledInstance(lblDisPic.getWidth(), lblDisPic.getHeight(), null);

Теперь можно создать ImageIcon для использования в JLabel.

lblDisPic.setIcon(new ImageIcon(resizedImage));

Ограничение этого метода заключается в том, что если размер JLabel изменен каким-либо образом, то изображение, содержащееся в JLabel, не будет изменено. Однако, поскольку JLabel будет использовать уменьшенное изображение оригинала, это будет означать, что объем требуемой памяти будет уменьшен (если эта проблема) и исходное изображение не должны быть изменены каждый раз, когда изображение отображается, как это было бы при переопределении метода paintComponent.

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

Ответ 2

Конечно, просто переопределите метод paintComponent, и вы можете масштабировать и рисовать его по своему усмотрению.

myLabel = new JLabel (/*whatever*/) {

    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        g.drawImage (myImageIcon.getImage(), 0, 0, getWidth (), getHeight (), null);
    }
};

Источник здесь.

ИЗМЕНИТЬ

Чтобы добавить к вашему изменению кода:

lblDisPic = new JLabel();

To:

lblDidPic = new JLabel() {

    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        if (icon != null) {
            g.drawImage (icon.getImage(), 0, 0, getWidth(), getHeight(), null);
        }
    }
};

Ответ 3

Вы можете переопределить метод paintIcon самого значка -

ImageIcon icon = new ImageIcon(...) {

    @Override
    public void paintIcon( Component c, Graphics g, int x, int y ) {
        g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c);
    }

    @Override 
    public int getIconHeight() {
        // see below...
    }

    @Override
    public int getIconWidth() {
        // see below...
    }

};

Изменить -

Я понял, что исходный размер изображения учитывается, когда Label решает, где разместить местоположение x, y значка. Вам нужно будет переопределить методы getIconWidth() и getIconHeight().

Однако нет хорошего способа переопределить их, чтобы вернуть размер метки, поскольку в этих методах нет ссылки на сам компонент.

Один из подходов заключался бы в создании нового класса, который расширяет ImageIcon и передает компонент в - отличный выбор, потому что это нарушает аспекты многократного использования многих компонентов.

Другим было бы просто переопределить эти методы во внутреннем классе, как указано выше, но поставить жестко привязанную ссылку на компонент как поле объекта или в качестве локальной переменной final. Опять же, это нарушает аспект "многоразового использования многих компонентов" и кажется немного "взломанным" вообще, но поскольку это единый внутренний класс, это может быть допустимым.

Ответ 4

Если вы можете отредактировать изображение в краске, то установите его размер соответственно в краске, а затем нажмите "Сохранить", а затем один и тот же размер изображения появится в вашем приложении JAVA.

Ответ 5

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

JFileChooser jFileChooser1=new JFileChooser();

int state = jFileChooser1.showOpenDialog(new JFrame());         
       jTextField1.setText("");

           if( state ==JFileChooser.APPROVE_OPTION) {
      JOptionPane.showMessageDialog(
                    null,null);
         File file = jFileChooser1.getSelectedFile();
         s2=file.toString();
          jTextField1.setText(s2);
       jLabel1=new JLabel();
     jLabel1.setName(s2);
  jLabel1.setLocation(50,50);
  jLabel1.setSize(300,300);
    add(jLabel1);

    BufferedImage bi1;

    try
    {   
        bi1=ImageIO.read(file);
        ImageIcon icon1=new ImageIcon(bi1);
        jLabel1.setIcon(icon1);
        Image img = ImageIO.read(jFileChooser1.getSelectedFile());

        Image resizedImage = 
   img.getScaledInstance(jLabel1.getWidth(), jLabel1.getHeight(),Image.SCALE_DEFAULT);
       jLabel1.setIcon(new ImageIcon(resizedImage)); 


  jLabel1.setBorder(BorderFactory.createLineBorder(Color.RED,5));


       pack();   

    }
    catch(Exception e)
    {
  System.out.println(e);
    }


    }
    else if(state == JFileChooser.CANCEL_OPTION) {
      JOptionPane.showMessageDialog(
                  new JFrame(), "Canceled");
    }
  pack();           

  }