Tengo un server-side código java que se presenta una matriz de bytes desde el cliente. A fin de hacer algunas de procesamiento de imágenes, que necesito para convertir la matriz de bytes en un BufferedImage. Tengo un código que se supone que lo que aquí:

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

    //bufferedImage is null
    //...
}

Pero esto no funciona; bufferedImage es nulo. De acuerdo a la ImageIO documentación:

Si no registrados ImageReader afirma ser capaz de leer el flujo resultante, null se devuelve.

¿Cómo puedo decirle a la ImageReader ¿qué tipo de imagen es. Por ejemplo, si yo sé que la imagen JPEG (que es, en mi caso), ¿qué se supone que tengo que hacer?

EDICIÓN: Gracias por la sugerencia de que el archivo es más probable que no en formato JPEG. Este es el código del lado del cliente que tengo que envía los datos como la Cuerda sobre el 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
}

Y este es el código del lado del servidor que llama a la processImage() función:

//Server-side code that calls processImage() function
public void handleRequest(String jsonData) {
    JSONObject jsonObject = new JSONObject(jsonData);
    processImage(jsonObject.getString("data").getBytes());
}
  • Para una mejor ayuda antes, publicar un SSCCE.
  • Está usted seguro de que la matriz de bytes que tiene buenos datos? ¿Has probado una prueba sencilla con un programa que lee una imagen, lo convierte en una matriz de bytes y, a continuación, convierte a esa matriz de bytes de la imagen.
  • ImageIO reconocerá un adecuado JPEG utilizando el código que has publicado. Así, más probable es que la imagen no está en formato JPEG. La forma más fácil de probar, es para el volcado de los datos de la matriz de disco, y ver lo que parece. Intente abrirlo en otro software, o mira en un editor hexadecimal. Tal vez la matriz de datos contiene el decodificado de píxeles de un archivo JPEG?
  • Gracias, he añadido más código para poder explicar mejor lo que mi código está haciendo
  • «He añadido más código..» ¿por Qué? Le sugerí una SSCCE – una muy específica & cosa diferente.
InformationsquelleAutor baekacaek | 2013-11-16

1 Comentario

  1. 4

    La explicación más probable es que la matriz de bytes no contiene una imagen JPEG. (Por ejemplo, si has intentado descargar, usted puede tener un documento HTML dando un error de diagnóstico.) Si ese es el caso, usted tendrá que encontrar cuál es la causa de esto y solucionarlo.

    Sin embargo, si usted «sabe» que la matriz de bytes que contiene una imagen con un formato determinado, se podría hacer algo como esto:

    1. Uso ImageIO.getImageReadersByFormatName o ImageIO.getImageReadersByMIMEType para obtener una Iterator<ImageReader>.
    2. Tire la primera ImageReader de la Iterator.
    3. Crear un MemoryCacheImageInputStream envolver un ByteArrayInputStream para los tipos.
    4. Uso ImageReader.setInput para conectar el lector a la ImageInputStream.
    5. Uso ImageReader.read para obtener el BufferedImage.
    • Gracias, tal vez el cliente no envía un legítimo de imagen JPEG. He añadido el código del cliente
    • Resultó la matriz de bytes no podía ser convertida en una Cadena sin que se dañe. Así que al final, los datos se corrompe y no contiene una imagen JPEG.
    • Sí … he visto que antes. new String(byte[]) etc son con pérdida cuando los bytes no estaban correctamente codificado de datos de carácter en el primer lugar.

Dejar respuesta

Please enter your comment!
Please enter your name here