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.
[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.
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?
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:
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.