Pergunta

Eu tenho um código Java do lado do servidor que obtém uma matriz de bytes do cliente.Para fazer algum processamento de imagem, preciso converter a matriz de bytes em um BufferedImage.Eu tenho um código que deveria fazer isso aqui:

public void processImage(byte[] data) {
    ByteArrayInputStream stream = new ByteArrayInputStream(data);
    BufferedImage bufferedImage;
    bufferedImage = ImageIO.read(stream);

    // bufferedImage is null
    //...
}

Mas isso não funciona;bufferedImage é nulo.De acordo com a documentação do ImageIO:

Se não estiver cadastrado ImageReader afirma ser capaz de ler o fluxo resultante, null é retornado.

Como posso contar ao ImageReader que tipo de imagem é.Por exemplo, se eu souber que a imagem é JPEG (o que é, no meu caso), o que devo fazer?

EDITAR: Obrigado pela sugestão de que o arquivo provavelmente não está no formato JPEG.Este é o código do lado do cliente que envia os dados como String para o servidor:

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 este é o código do lado do servidor que chama a função processImage():

// Server-side code that calls processImage() function
public void handleRequest(String jsonData) {
    JSONObject jsonObject = new JSONObject(jsonData);
    processImage(jsonObject.getString("data").getBytes());
}
Foi útil?

Solução

A explicação mais provável é que a matriz de bytes não contém uma imagem JPEG.(Por exemplo, se você acabou de tentar baixá-lo, pode ter um documento HTML fornecendo um diagnóstico de erro.) Se for esse o caso, você precisará descobrir o que está causando isso e corrigi-lo.

Porém, se você "sabe" que a matriz de bytes contém uma imagem com um determinado formato, você poderia fazer algo assim:

  1. Usar ImageIO.getImageReadersByFormatName ou ImageIO.getImageReadersByMIMEType para obter um Iterator<ImageReader>.
  2. Puxe o primeiro ImageReader de Iterator.
  3. Criar um MemoryCacheImageInputStream embrulhando um ByteArrayInputStream para os tipos.
  4. Usar ImageReader.setInput para conectar o leitor ao ImageInputStream.
  5. Usar ImageReader.read para obter o BufferedImage.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top