Boa tarde.
Preciso transformar uma imagem no tipo byte[] para salvar no banco de dados, porém não estou conseguindo fazer isso.
Até agora estava utilizando o seguinte código para resgatar a informação que o usuário digitou na tela:
String diferencial5 = telaFicha.getjTextField_Diferencial5().getText();
Porém como faço para resgatar o byte[] da imagem que o usuário selecionou?
Código:
public class CriarFichaController extends Menu {
private final CriarFicha telaFicha;
private Connection con;
public CriarFichaController(CriarFicha telaFicha) {
this.telaFicha = telaFicha;
}
public void salvarFicha() throws ClassNotFoundException, SQLException {
String diferencial5 = telaFicha.getjTextField_Diferencial5().getText();
byte[] imagem = telaFicha.getjLabel_Imagem().get //Como completo esse?
Ficha ficha = new Ficha(diferencial5, imagem);
CriarFichaDAO criarFichaDAO = new CriarFichaDAO();
if (criarFichaDAO.existeFichaNoBanco(ficha) == false) {
criarFichaDAO.insert(ficha);
JOptionPane.showMessageDialog(null, "Ficha cadastrada com sucesso!");
telaFicha.dispose();
} else {
JOptionPane.showMessageDialog(null, "Este produto ja está cadastrado!");
}
}
}
cria um método pra ficar mais facil
private byte[] converterImagem(File file) throws FileNotFoundException {
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
}
} catch (IOException ex) {
ex.printStackTrace();
}
byte[] bytes = bos.toByteArray();
return bytes;
}
chama assim:
byte[] byteImage = converterImagem(new File("caminho_da_img.jpg"));
Pra visualizar a img, eu salvo ela no pc, se a imagem ja existir, eu só mostro a img q ta armazenada, senao eu pego do banco e salvo.
public byte[] getImage(byte[] img) {
try {
File f = new File(camponome.getText() + ".jpg");
if (f.exists() && !f.isDirectory()) {
} else {
ByteArrayInputStream bis = new ByteArrayInputStream(img);
BufferedImage bImage2 = ImageIO.read(bis);
ImageIO.write(bImage2, "jpg", new File(VISITANTE_FOLDER + camponome.getText() + ".jpg"));
}
} catch (IOException ex) {
ex.printStackTrace();
}
return img;
}
e vc chama assim:
getImage(rs.getBytes("imagem"));
Caso vc nao queira salvar a img no pc, basta fazer assim:
ByteArrayInputStream bis = new ByteArrayInputStream(img);
BufferedImage bImage2 = ImageIO.read(bis);
ImageIcon i = new ImageIcon(new ImageIcon(bImage2).getImage().getScaledInstance(campoimagem.getWidth(), campoimagem.getHeight(), Image.SCALE_SMOOTH));
campoimagem.setIcon(i); //isso é uma lbl
Obrigado, fiz o teste com um caminho de imagem estático e funcionou perfeitamente, porém não estou conseguindo acessar o valor de uma variável chamada caminhoImagem que está na classe CriarFicha e no método:
public void selecionarImagem() {
JFileChooser arquivo = new JFileChooser();
arquivo.setDialogTitle("Selecione uma imagem");
arquivo.setFileSelectionMode(JFileChooser.FILES_ONLY); //Seta busca de somente uma imagem por vez
int opcao = arquivo.showOpenDialog(this);
if (opcao == JFileChooser.APPROVE_OPTION) {
File file = new File("Caminho");
file = arquivo.getSelectedFile(); //Recebe o caminho da imagem
caminhoImagem = file.getAbsolutePath();
jTextField_Caminho.setText(caminhoImagem); //Mostra o caminho da imagem na tela
ImageIcon imagem = new ImageIcon(arquivo.getSelectedFile().getPath());
jLabel_Imagem.setIcon(new ImageIcon(imagem.getImage().getScaledInstance(jLabel_Imagem.getWidth(), jLabel_Imagem.getHeight(), jLabel_Imagem.getWidth())));
}
}
O método que você ensinou esta contido em uma outra classe chamada CriariFichaController. Tentei acessar o valor da variável caminhoImagem da seguinte forma, porém não deu certo pois ele traz um valor null (valor setado quando inicializo a variável como global na classe CriarFicha).
byte[] byteImage = converterImagem(new File(criarFicha.getCaminhoImagem()));
Instanciei e criei o método get como pode ver na linha acima. Acho que deve ser porque criei a variável caminhoImagem como uma variável global (pode ser acessada por todos os métodos), porém não vejo outra forma a não ser criando a variável como global.
Pode me ajudar? Basicamente só preciso entender como acessar o valor da variável caminhoImagem que está em uma classe diferente de onde está o método que você ensinou.
vi vc usando o getCaminhoImagem();
, mas nao te vi usando o setCaminhoImagem()
.
Vc tem que setar o caminho, pra depois usa-lo, por exemplo:
File file = new File("Caminho");
file = arquivo.getSelectedFile(); //Recebe o caminho da imagem
String caminhoImagem = file.getAbsolutePath();
criarFicha.setCaminhoImagem(caminhoImagem);
jTextField_Caminho.setText(caminhoImagem); //Mostra o caminho da imagem na tela
Aí na hora de recuperar vc faz:
byte[] byteImage = converterImagem(new File(criarFicha.getCaminhoImagem()));
Se iniciar a variável caminhoImagem dentro do método da forma que você disse, o java não permite utilizar os getters e setters.
Fiz de uma forma um pouco diferente, porém seguindo a sua linha de raciocínio, porém mesmo assim não deu certo, fica com o mesmo valor quando inicializo a variável e não o valor correto que seria o caminho da imagem:
File file = new File("Caminho");
file = arquivo.getSelectedFile(); //Recebe o caminho da imagem
setCaminhoImagem(file.getAbsolutePath());
//caminhoImagem = file.getAbsolutePath();
jTextField_Caminho.setText(caminhoImagem); //Mostra o caminho da imagem na tela
Somente acrescentei o setCaminhoImagem() e retirei a linha debaixo dele, mesmo assim não funcionou, continua retornando null.
Inicializei a variável caminhoImagem da seguinte forma:
public class CriarFicha extends javax.swing.JInternalFrame {
CriarFichaController controller = new CriarFichaController(this);
String caminhoImagem = "";
Vc ta confundindo as coisas, pq o java nao permitiria usar a variavel q foi criada?
Vamos ser certeiros, vc quer pegar esse caminho de onde? de outro JFrame? Qual a necessidade do getter e setter?
Quando eu crio a variável dentro do método, aparece o seguinte erro:
De qualquer forma consegui resolver, tenho um campo que mostra ao usuário o caminho da imagem, simplesmente acessei a informação do caminho da imagem por ele, ao em vez de acessar a informação pela variável caminhoImagem.
Muito obrigado pela ajuda.
Na imagem não saiu o erro, mas o netbeans pede pra criar uma variável local chamada caminhoImagem.
pq vc nao tinha a variavel global chamada caminhoImagem.
No caso eu deveria inicializar uma variável global caminhoImagem e inicializar a mesma variável dentro do método?
Global não, de instância. 

o correto é variavel de instancia
?
Sim e se for static
é variável de classe.
Java não tem o conceito de variável global como o Object Pascal por exemplo.
O mais próximo de uma variável global no Java seria um atributo com os modificadores public
e static
dentro de uma classe public
, como por exemplo o atributo out
da classe System
.
1 curtida
Essa da variável de instância eu não sabia, na faculdade aprendemos que uma variável que é criada fora dos métodos e que pode ser acessada por todo e qualquer método da classe, é chamada de variável global.
Obrigado!
Eita… Isso é coisa de professor que mistura conceitos de programação estruturada com programação orientada à objetos.
1 curtida