Puxando código de criação da imagem e gerando nele, um ImageIcon

O que eu quero dizer com esse título é o seguinte,

Aqueles que já utilizaram o sistema de cópia do Java, já perceberam que o que ele faz é exatamente o seguinte:

Ele lê todo o código que existe por trás da imagem e recria esse texto em outro local só que muda a extensão e o deixa como se fosse uma imagem.

Por exemplo, se vc apertar o botão direito na imagem e mandar abrir com algum editor de texto, verá que aparece vários códigos, e aquele código forma a imagem.

Depois de analisar isso eu queria que ele fizesse o seguinte:

Queria que meu programa lesse toda essa informação da imagem e armazenasse no banco de dados todo o código da imagem (De forma que não perca a sua estrutura original, pq se tiver algo errado não funciona) que é para depois de armazenado, eu poder exibir as imagens temporariamente com o ImageIcon somente via o código que está armazenado no banco de dados, que é o código da imagem.

Alguem já estudou isso? Conhece algum tópico ou pode explicar mais ou menos?

Pq eu estava fazendo isso, mas sempre fica algo errado, Talvez por eu estar utilizando o FileWriter, se puderem me auxiliar, estou a disposição.

Esse texto que você viu quando abriu a imagem em um editor é simples representação de um byte, e não dá para tirar nada de proveitoso ali. Você precisa abrir a imagem em um editor de hexadecimal para ver os valores corretos. Consegue até enxergar as informações de exif, se for um formato jpeg.

Sobre guardar a imagem em um banco, pode criar um campo string, recuperar os bytes da imagem e codificalos em um base64.

Mas cuidado com o tamanho das imagens, guardá-las como string é bom se forem imagens pequenas.

cara você pode utilizar o FileInputStream, pegar somente os bytes e salvar no banco.

FileInputStream stream = new FileInputStream(new File("C:\\imagem.jpg"));
byte[] b = new byte[3000];
stream.read(b);

A variável b armazena os bytes da imagem.

[quote=Gerson da S. Lima]cara você pode utilizar o FileInputStream, pegar somente os bytes e salvar no banco.

FileInputStream stream = new FileInputStream(new File("C:\\imagem.jpg"));
byte[] b = new byte[3000];
stream.read(b);

A variável b armazena os bytes da imagem.[/quote]

Complica fazer assim, porque sem codificar a imagem vai ocupar muito espaço.

Uma imagem de 3 bytes(RGB), 250x250(pequena) ocupa

byte[] b = new byte[250x250*3];

Faz a conta e olha como vai consumir.

Codifique com base64 primeiro, para reduzir o tamanho.

A maioria dos bancos também suporta o formato blob. Grave byte-por-byte da imagem lá, e recupere depois. Será necessário gravar também o nome do formato do arquivo da imagem em uma coluna, para poder interpretar aqueles bytes depois.

Vlw galera, ajudou bastante.

Então, eu vou gravar no campo do banco de dados do Tipo Text, pq ele deixa a String infinita e ele tbm respeita os espaços e quebra de linhas.

Mas uma coisa.

Com esse Byte (Estou falando pq eu nunca utilizo o byte) qual a diferença dele? e outra coisa, como é que eu faço para gravar exatamente do mesmo jeito no banco de dados, eu teria que fazer algo assim na continuação do código:

    FileInputStream stream = new FileInputStream(new File("C:\\imagem.jpg"));  
       byte[] b = new byte[3000];  
       stream.read(b);  

PreparedStatement smt = xxx ("INSERT INTO blablabla (codigo_da_foto,formato) VALUES (?,?)");

smt.setString(1,b);
smt.setString(2,"jpg");

smt.execute();

ou eu preciso alterar alguma coisa?

Uma coisa que eu tenho dúvida é como armazenar numa String os valores.
pq no stream.read alí em cima só tem a opção de ler e opções do arquivo.
Mas como faz pra armazenar numa String esses bytes =/

@ViniGodoy

Como é que faz para ler byte por byte nesse caso?

Obrigado aí galera!

[quote]Mas uma coisa.

1. FileInputStream stream = new FileInputStream(new File("C:\\imagem.jpg"));
2. byte[] b = new byte[3000];
3. stream.read(b);

Com esse Byte (Estou falando pq eu nunca utilizo o byte) qual a diferença dele? e outra coisa, como é que eu faço para gravar exatamente do mesmo jeito no banco de dados, eu teria que fazer algo assim na continuação do código:

view plaincopy to clipboardprint?

  1. FileInputStream stream = new FileInputStream(new File("C:\\imagem.jpg"));    
    
  2.    byte[] b = new byte[3000];    
    
  3.    stream.read(b);    
    
  4. PreparedStatement smt = xxx (“INSERT INTO blablabla (codigo_da_foto,formato) VALUES (?,?)”);
  5. smt.setString(1,b);
  6. smt.setString(2,“jpg”);
  7. smt.execute();

FileInputStream stream = new FileInputStream(new File(“C:\imagem.jpg”)); byte[] b = new byte[3000]; stream.read(b); PreparedStatement smt = xxx (“INSERT INTO blablabla (codigo_da_foto,formato) VALUES (?,?)”); smt.setString(1,b); smt.setString(2,“jpg”); smt.execute();

ou eu preciso alterar alguma coisa? [/quote]

você faria mais ou menos assim:


FileInputStream stream = new FileInputStream(new File("C:\\imagem.jpg"));
byte[] b = new byte[3000];
stream.read(b);  

PreparedStatement smt = xxx ("INSERT INTO blablabla (codigo_da_foto, formato) VALUES (?,?)");

smt.setBytes(1, b);
smt.setString(2, "jpg");

smt.execute();

Esqueci de mencionar, no início do seu post você falou que somente exibiria a imagem em um ImageIcon, por isso eu não falei que tinha de armazenar a extensão do arquivo, pois o ImageIcon pode receber somente os bytes da imagem.

Caso você vá precisar da imagem pra qualquer outra coisa, aí sim, você precisa armazenar o formato (jpg, gif, png), e talvez até o nome da imagem. Em um dos sistemas que trabalho nós precisamos armazenar esses informações, pois o sistema possui um editor de texto, tipo um editor de e-mail, onde você pode colocar no meio do texto, anexos, que podem ter qualquer formato (jpg, png, doc, odt, xls, etx), e é necessário armazenar todas as informações do arquivo, agora depende do que você precisa, se for só pra exibir no ImageIcon, armazenar somente os bytes é suficiente, se não você precisa sim armazenar as outras informações.