Dúvida sobre retorno do getScaledInstance

Olá, sou iniciante no java, estou trabalhando um pouco com imagens ultimamente, utilizei bastante o getScaledInstance, pelo que eu sei ele retorna uma versão menor da imagem, tem alguma maneira de fazer com que esse retorno volte com a mesma qualidade da imagem original?

Olá, Thallysson!

O método getScaledInstance, na verdade, retorna uma imagem redimensionada, tanto ampliação quanto redução.

No caso da redução das imagens, a qualidade é praticamente idêntica à imagem original. No caso da ampliação, caso o tamanho passado como parâmetro seja maior que o tamanho original, a imagem começa a sofrer perdas de qualidade por conta da natureza das imagens bitmap.

Uma forma de evitar uma maior deterioração da imagem é alterar o parâmetro hints do método, que pode ser um dos seguintes valores:

  • Image.SCALE_DEFAULT;
  • Image.SCALE_FAST;
  • Image.SCALE_SMOOTH;
  • Image.SCALE_REPLICATE;
  • Image.SCALE_AREA_AVERAGING.

Exemplo:

Image resultado = original.getScaledInstance(larguraDesejada, alturaDesejada, Image.SCALE_SMOOTH);

Espero ter ajudado!

Abcs!

Ok, muito obrigado pelas informações, eu estava utilizando o Image.SCALE_DEFAULT

Você sabe porque utilizando o SCALE_SMOOTH a imagem não aparece?

Deveria aparecer… Você pode colar um trecho do código?

`

package Objects;

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import com.towel.swing.img.JImagePanel;

public class janela extends JFrame{
 ImageIcon icon = new ImageIcon(getClass().getResource("/Assets/gif.gif"));
 JLabel l = new JLabel(icon);
 janela(){
  
  setTitle("Teste");
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setLocationRelativeTo(null);
  setExtendedState(JFrame.MAXIMIZED_BOTH);
  
  icon.setImage(icon.getImage().getScaledInstance(this.getWidth()-250,this.getHeight(),Image.SCALE_SMOOTH));
  add(l);      
  validate();
}
public static void main(String[]args){
   janela j = new janela();
  }
}

`

Pode ser algum problema com o import:

import com.towel.swing.img.JImagePanel;

Mudando o código para:

package objects;

import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Janela extends JFrame {
	ImageIcon icon = new ImageIcon(getClass().getResource("/Assets/gif.gif"));
	JLabel l = new JLabel(icon);

	Janela() {
		setTitle("Teste com jimagepanel");
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		icon.setImage(icon.getImage().getScaledInstance(this.getWidth() - 250,
				this.getHeight(), Image.SCALE_SMOOTH));
		add(l);
		validate();
	}

	public static void main(String[] args) {
		Janela j = new Janela();
	}
}

Funcionou :slightly_smiling:

Outra dica: no Java, a convenção é que o nome dos pacotes seja minúsculo e o nome das classes comece com letra maiúscula :wink:

Não funcionou aqui, não creio que o erro foi no import, e esse import estava aí porque eu estava trabalhando com jimagepanel, e não consegui, então decidi fazer com uma jlabel, sobre os pacotes, então eu mudo os nomes.