Como converter matriz de bytes em imagem em buffer
-
21-12-2019 - |
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());
}
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:
- Usar
ImageIO.getImageReadersByFormatName
ouImageIO.getImageReadersByMIMEType
para obter umIterator<ImageReader>
. - Puxe o primeiro
ImageReader
deIterator
. - Criar um
MemoryCacheImageInputStream
embrulhando umByteArrayInputStream
para os tipos. - Usar
ImageReader.setInput
para conectar o leitor aoImageInputStream
. - Usar
ImageReader.read
para obter oBufferedImage
.