Come posso convertire un BufferedImage oggetto InputStream o un BLOB?

Sto cercando di memorizzare un’immagine caricata dall’utente nel database con un LONGBLOB attributo… mi sono imbattuto in un problema con un PreparedStatement che ha due metodi per impostare un blob che sono:

public void setBinaryStream(int parameterIndex, InputStream x)

public void setBlob(int parameterIndex, Blob x)

public void setBlob(int parameterIndex, InputStream inputStream)

Ora il problema è che ho un BufferedImage oggetto che deve essere convertito in Blob o InputStream per caricare…

Come posso fare questo senza perdere l’originale in formato immagine o la qualità?

InformationsquelleAutor Asif | 2011-10-04



4 Replies
  1. 29

    Come posso fare questo senza perdere l’originale in formato immagine o la qualità?

    È necessario salvare utilizzando alcuni appropriati (lossless) di formato. Il il formato png è un’opzione.

    Il ImageIO classe dispone di metodi per la scrittura di un’immagine a un flusso di output.

    Ecco un esempio completo di come entrare in possesso di un InputStream da cui si può leggere il formato PNG-rappresentazione del contenuto di un BufferedImage:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "png", baos);
    InputStream is = new ByteArrayInputStream(baos.toByteArray());
    • Grazie Csujo e @aioobe per la rapida risposta….ma in entrambi i casi devo gestire anche il formato in arrivo di immagine…non c’è nessun altro modo per fare la stessa cosa senza che formato di conversione ??
    • Come si fa a ricevere questo “in arrivo” dell’immagine?
    • Scegliendo immagine utilizzando la finestra di selezione file
    • Quindi utilizzare un FileInputStream per salvare l’originale matrice di byte lungo il lato con la tamponata di immagine. Per quanto di mia conoscenza, non c’è modo di “recuperare” l’esatta sequenza di byte che una volta era utilizzato per generare il contenuto di un BufferedImage.
    • va bene….grazie…ho avuto modo giusto…:)
    • Nessun problema, sei il benvenuto.

  2. 3

    Ecco un esempio di codice:

    ByteArrayOutputStream bas = new ByteArrayOutputStream();
    ImageIO.write(image,"jpg", bas);
    byte[] bytes = bas.toByteArray();
    InputStream is = new ByteArrayInputStream(bytes);

    Non dimenticare di controllare il secondo ImageIO.scrivi parametro richiesto il formato di immagine (ad esempio, “jpg”, “bmp”, “png”).

  3. 1

    Funzioni di scrittura per serializzare/unserialize il BufferedImage
    a/da un byte [] e classi di uso del ByteArrayInputStream e
    ByteArrayOutputStream.

    Probabilmente è necessario serializzare il tipo di immagine, larghezza, altezza
    e l’immagine di pixel (valori ottenuti con BufferedImage.getRGB(x, y)).

    L’alternativa è chiamare ImageIO.write(image, "png", outStream)
    per convertire l’immagine in formato PNG e scrivere un
    ByteArrayOutputStream. C’è un equivalente ImageIO.read(inputStream)
    metodo per leggere l’immagine da un ByteArrayInputStream.
    C’è un certo overhead di elaborazione nella conversione a/da PNG.
    Ma il PNG è un formato di immagine compresso e vi farà risparmiare un sacco
    di spazio rispetto a memorizzare le immagini in formato non compresso.

    • Ciao, puoi dirci qualcosa di più il primo metodo?
  4. 0

    Per creare un Blob:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "png", baos);
    Blob blFile = new javax.sql.rowset.serial.SerialBlob(baos.toByteArray());

Lascia un commento