Come convertire l'array di byte sull'immagine bufferizzata
-
21-12-2019 - |
Domanda
Ho un codice Java lato server che ottiene un array di byte dal cliente.Per effettuare un po 'di elaborazione delle immagini, ho bisogno di convertire l'array di byte in un BufferedImage
.Ho un codice che dovrebbe farlo qui:
public void processImage(byte[] data) {
ByteArrayInputStream stream = new ByteArrayInputStream(data);
BufferedImage bufferedImage;
bufferedImage = ImageIO.read(stream);
// bufferedImage is null
//...
}
.
Ma questo non funziona;Bufferedimage è nullo.Secondo la documentazione IMMAGINIIO:
.Se non viene rivendicata
ImageReader
registrata per essere in grado di leggere il flusso risultante, è restituitonull
.
Come posso dire al ImageReader
che tipo di immagine è.Ad esempio, se so che l'immagine è JPEG (che è, nel mio caso), cosa dovrei fare?
Modifica: Grazie per il suggerimento che il file è molto probabilmente non in formato JPEG.Questo è il codice lato client che ho inviato i dati come stringa sul server:
import org.json.JSONObject;
// Client-side code that sends image to server as String
public void sendImage() {
FileInputStream inputStream = new FileInputStream(new File("myImage.jpg"));
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((bytesRead = inputStream.read(b)) != -1) {
byteStream.write(b,0,bytesRead);
}
byte[] byteArray = byteStream.toByteArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("data",new String(byteArray));
// ... more code here that sends jsonObject in HTTP post body
}
.
E questo è il codice lato server che chiama la funzione ProcessImmagine ():
// Server-side code that calls processImage() function
public void handleRequest(String jsonData) {
JSONObject jsonObject = new JSONObject(jsonData);
processImage(jsonObject.getString("data").getBytes());
}
. Soluzione
La spiegazione più probabile è che l'array di byte non contiene un'immagine JPEG.(Ad esempio, se hai appena tentato di scaricarlo, potresti avere un documento HTML dando un errore diagnostico.) Se è così, dovrai trovare ciò che sta causando questo e risolverlo.
Tuttavia, se si "sai" che la matrice Byte contiene un'immagine con un dato formato, potresti fare qualcosa del genere:
- .
- Utilizzare
ImageIO.getImageReadersByFormatName
oImageIO.getImageReadersByMIMEType
per ottenere unIterator<ImageReader>
. - Tirare il primo
ImageReader
dalIterator
. - Crea un
MemoryCacheImageInputStream
wrapping aByteArrayInputStream
per i tipi. - Utilizzare
ImageReader.setInput
per collegare il lettore alImageInputStream
. - Utilizzare
ImageReader.read
per ottenere ilBufferedImage
.