Carregar imagem de arquivo para um panel

8 respostas
L

ola gostaria de carregar uma imagem de um arquivo para um panel… porem não posso usar a rotina pronta do java para fazer isto ImageIO.read retornado um BufferedImage e passando para o g.drawImage… ou seja tenho que fazer isto na unha… sem usar nada dessas apis… no maximo do maximo a classe File… como posso fazer isto alguem tem alguma ideia?

8 Respostas

V
  1. Procure a documentação do formato de imagem que você quer usar.
  2. Abra o arquivo, usando um InputStream qualquer e analise os dados.
  3. Você será obrigado a usar o método Graphics pelo menos para pintar os pontos da imagem na tela.
L

mas pegando o InputStream como faço para pegar suas informações para pinta-la com o Graphics?

K

Como disse o ViniGodoy.
Só tem um jeito de se fazer isto, assim:

Primeiro crie uma classe que estenda JPanel:
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class PanelMain extends JPanel {

	public PanelMain() {
		super();
		setLayout(null);
	}
	
	public void paintComponent(Graphics g){
		Image img = new ImageIcon(getClass().getResource("/images/bandeira1.jpg")).getImage();
		super.paintComponent(g);
		int x = 0;
		int y = 0;
		g.drawImage(img, x, y,this);			
	}

}
Em seguida, crie o JFrame que vai exibir este painel:
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;

public class TestMain extends JFrame {

	private final PanelMain panelMain = new PanelMain();
	
	public TestMain() {
		super();		
		setMinimumSize(new Dimension(700, 500));		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		getContentPane().add(panelMain);		
	}
   
     //daqui para baixo é para você testar o form	
	public static void main(String args[]) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TestMain frame = new TestMain();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

}
Assim nem precisa de File ou InputStream. Você simplesmete coloca este método na sua classe que estenda JPanel. Não tem erro, vai funcionar logo na primeira tentativa!
V

Acho que ele quer pintar na unha, sem o ImageIcon.

No caso de um BMP, você teria que decodificar o cabeçalho e depois ler os valores RGB presentes em cada pixel. Com isso vc gera um color e pinta um ponto na posição do pixel:

O BMP é um formato bastante direto. 3 bytes de cor são gravados lado-a-lado. E os pixels são gravados em sequencia. Não há compactação.

Se você lidar com jpeg, gif, ou png, terá que lidar com a compactação. Nesse caso, além do cabeçalho, terá que buscar pelo algoritmo que faz isso. É um processo um pouco mais complexo.

J

O modelo jpeg suporta várias informações no arquivo como o exif. A melhor maneira de lidar com imagens digitais é saber como funcionam os formatos, e estudar a sua parte matemática.

Aqui o datasheet do formato jpeg.

O BMP é o mais simples, pois não há nenhuma estrutura complexa por detráz dele. Apenas sequências de bytes.

L

ViniGodoy:
Acho que ele quer pintar na unha, sem o ImageIcon.

No caso de um BMP, você teria que decodificar o cabeçalho e depois ler os valores RGB presentes em cada pixel. Com isso vc gera um color e pinta um ponto na posição do pixel:

O BMP é um formato bastante direto. 3 bytes de cor são gravados lado-a-lado. E os pixels são gravados em sequencia. Não há compactação.

Se você lidar com jpeg, gif, ou png, terá que lidar com a compactação. Nesse caso, além do cabeçalho, terá que buscar pelo algoritmo que faz isso. É um processo um pouco mais complexo.

Exatamente… como o Vinni disse eu quero pintar na unha…

E

Deixando de brincadeiras:

Vai ser bem lento; acho que é melhor você ler sobre os algoritmos e entendê-los, em vez de fazer as coisas “no braço”.

Até porque boa parte dos algoritmos nem em Java é implementado, mas sim em C com algumas partes em assembly.

L

sim eu percebi… usam jni na api da sun… até ai sem problemas faço a coisa em C depois só chamo ele no java…
mas o que eu preciso e saber como fazer…

Criado 27 de novembro de 2009
Ultima resposta 30 de nov. de 2009
Respostas 8
Participantes 5