Imagem Bitmap passada para Matriz

Ola, pessoal estou tentando pegar uma imagem bitmap qualquer (bmp ou jpg) e converter ela numa matriz (tentei awt ou jai) alguém ja fez isso? Se tiver como me da alguma dica eu agradeço.

Minha idéia é pegar essa imagem e quebrar ela em várias partes e depois montar.

exemplo: 1 imagem 200 kb, fazer 10 matrizes de 20 kb e depois montar a imagem que está nessas matrizes e mandar mostrar a imagem.

Obrigado,

Virgílio.

[code]BufferedImage img = ImageIO.read("exemplo.png");
int[][] imagem = new int[img.getWidth()][img.getHeight()];

for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
imagem[x][y] = img.getRGB(x,y);
}
}
[/code]

Outra alternativa mais rápida e menos trabalhosa é gerar BufferedImages menores em memória (através do new) e usar o método drawImage do objeto Graphics de cada uma delas para fazer a cópia.

Para copiar os dados com mais performance, e mantendo o formato original da imagem, use os Rasters.

Finalmente, há a possibilidade de gerar apenas imagens menores lógicas, através do método getSubImage do BufferedImage (todas elas compartilharão a mesma área de memória, mas se comportarão como se fossem imagens diferentes). É a alternativa mais rápida e mais economica de todas, mas não é ideal caso você queira alterar as partes individualmente depois.

Lembrei que já havia postado um método que faz a divisão de imagem usando BufferedImages aqui no GUJ:
http://www.guj.com.br/java/68170-como-mapear-uma-imagem-para-mim-fazer-uma-parte-apenas-da-imagem-virar-tipo-um-botao#358250

Note que é bem fácil adapta-lo para usar o getSubImage.

Obrigado por responder ViniGodoy.

Acabo de ler suas mensagens e vou tentar ver o que eu consigo!

Acredito que a primeira opção a qual você comentou seja a melhor para mim, pois eu quero transformar uma imagem bitmap em matriz, pois pretendo transmistir a imagem atravez do padrão ZigBee (IEEE 802.15.4) e a limitação fisica é de 127 bytes por pacote, então estou pensando em quebrar a imagem de acordo com o seu tamanho, apos ter ela em uma matriz eu envio pacote por pacote (dentro da sua limitação).

Agora outro problema é concatenar corretamente no outro ponto, pois ele vai ficar recebendo, acredito que devo ter que ter tipo um buffer, ou matriz maior para ir recebendo a cada pacote e ir montando a imagem.

Na sua opinião, você acha que a primeira opção que você comentou é a melhor também?

Você teria algum pdf para eu ver sobre essa API ou algo que pudesse me orientar?

Obrigadão por ajudar!

Virgílio.

Eu trabalharia apenas com os dados binários, sem me preocupar se é uma imagem, um arquivo, ou sei lá o que. Simplesmente abriria um FileInputStream com o arquivo de imagem e sairia mandando byte a byte.

Claro, seria necessário um pequeno protocolo de aplicação para indicar o nome do arquivo, tamanho, etc. Não sei se o ZigBee dá garantias de ordenação ou entrega, caso não dê, também será necessário adicionar a esse protocolo de aplicação um checksum e implementar uma janela deslizante.

Opa, vou tentar ja estou dando uma olhada e conhecendo melhor, depois eu posto o que eu consegui.

O ZigBee não tem confirmação, e pretendo nem fazer um cheksum pois mesmo que algum pacote seja perdido, é melhor do que eu sobrecarregar a rede e talvez acabar com a grande vantagem do padrão, que é a economia de bateria. (eu acho. rs)

Esse fileinputstream será que eu poderia colocar uma condição para dividir os bytes em grupos, ou por exemplo a cada tantos bytes eu dava um SEND, estava vendo algo tipo:

long tamanhoEmMB = arquivo.length() / 1024;

Talvez pude-se ter uma condição em bytes.

Valeu, obrigado,

Sim, é isso que seu protocolo deve fazer. Você envia informações adicionais, para o controle da transmissão.
Dê uma olhada no DataOutputStream. Ele pode ser associado a um FileInputStream para você enviar essa informação de controle facilmente.

Confirmar ou não dados depende muito do tipo de transmissão que você queira implementar, e da confiabilidade do canal. Num protocolo para imagens, você realmente poderia não confirmar, e transformar os bits perdidos na cor de seus vizinhos, é o que os protocolos de streaming de vídeo e áudio fazem.

Mas se você quiser transmitir outros arquivos, você será obrigado a implementar um mecanismo de confirmação, validação e reenvio. Nesse caso, uma boa referência seria ler o funcionamento do protocolo TCP/IP no livro do Tanembaum.