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
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
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.