Carregar imagem de arquivo para um panel

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?

  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.

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

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

Primeiro crie uma classe que estenda JPanel:

[code]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);			
}

}[/code]
Em seguida, crie o JFrame que vai exibir este painel:

[code]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();
			}
		}
	});
}

}[/code]
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!

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.

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.

[quote=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.[/quote]

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

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.

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…