[RESOLVIDO]Transformar imagem em byte[]

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?

Não, só global

Global não, de instância. :wink:

:thinking:

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