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, è restituito null.

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());
}
.

È stato utile?

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:

    .
  1. Utilizzare ImageIO.getImageReadersByFormatName o ImageIO.getImageReadersByMIMEType per ottenere un Iterator<ImageReader>.
  2. Tirare il primo ImageReader dal Iterator.
  3. Crea un MemoryCacheImageInputStream wrapping a ByteArrayInputStream per i tipi.
  4. Utilizzare ImageReader.setInput per collegare il lettore al ImageInputStream.
  5. Utilizzare ImageReader.read per ottenere il BufferedImage.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top