2012-07-25 7 views
5

Necesito recuperar el alto y el ancho de la imagen cargada mediante App Engine BlobStore. Para encontrar que utilicé siguiente código:Error: java.lang.UnsupportedOperationException: no hay datos de imagen disponibles cuando se usa BlobStore y API de imagen de App Engine

try { 
      Image im = ImagesServiceFactory.makeImageFromBlob(blobKey); 

      if (im.getHeight() == ht && im.getWidth() == wd) { 
       flag = true; 
      } 
     } catch (UnsupportedOperationException e) { 

     } 

puedo subir la imagen y generar el BlobKey pero cuando pase el BlobKey a makeImageFromBlob(), se generará el error siguiente:

java.lang.UnsupportedOperationException: No image data is available

Cómo resuelva este problema o de cualquier otra forma para encontrar la altura y el ancho de la imagen directamente desde BlobKey.

Respuesta

6

La mayoría de los métodos en la propia imagen arrojarán actualmente UnsupportedOperationException. Así que utilicé com.google.appengine.api.blobstore.BlobstoreInputStream.BlobstoreInputStream para manipular datos de blobKey. De esa forma puedo obtener el ancho y la altura de la imagen.

byte[] data = getData(blobKey); 
Image im = ImagesServiceFactory.makeImage(data); 
if (im.getHeight() == ht && im.getWidth() == wd) {} 
private byte[] getData(BlobKey blobKey) { 
    InputStream input; 
    byte[] oldImageData = null; 
    try { 
     input = new BlobstoreInputStream(blobKey); 
       ByteArrayOutputStream bais = new ByteArrayOutputStream(); 
     byte[] byteChunk = new byte[4096]; 
     int n; 
     while ((n = input.read(byteChunk)) > 0) { 
      bais.write(byteChunk, 0, n); 
     } 
     oldImageData = bais.toByteArray(); 
    } catch (IOException e) {} 

    return oldImageData; 

} 
3

Si puede utilizar la guayaba, la aplicación es más fácil de seguir:

public static byte[] getData(BlobKey blobKey) { 
    BlobstoreInputStream input = null; 
    try { 
     input = new BlobstoreInputStream(blobKey); 
     return ByteStreams.toByteArray(input); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } finally { 
     Closeables.closeQuietly(input); 
    } 
} 

El resto se mantiene igual.

0

Otra posibilidad es hacer una transformación inútil en la imagen (como la rotación de 0 grados)

Image oldImage = ImagesServiceFactory.makeImageFromFilename(### Filepath ###); 
Transform transform = ImagesServiceFactory.makeRotate(0); 
oldImage = imagesService.applyTransform(transform,oldImage); 

Después de que la transformación, es posible obtener la anchura & altura de la imagen como se esperaba:

oldImage.getWidth(); 

Incluso si esto funciona, esta transformación influye negativamente en el rendimiento;)

Cuestiones relacionadas