2012-07-25 4 views
5

Devo recuperare l'altezza e la larghezza dell'immagine caricata tramite il BlobStore di App Engine. Per trovare che ho usato seguente codice:Errore: java.lang.UnsupportedOperationException: non sono disponibili dati immagine quando si utilizza il BlobStore e l'API immagine di App Engine

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

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

     } 

posso caricare l'immagine e generare il BlobKey ma quando passare il Blobkey a makeImageFromBlob(), che genera il seguente errore:

java.lang.UnsupportedOperationException: No image data is available

Come risolvere questo problema o qualsiasi altro modo per trovare l'altezza e la larghezza dell'immagine direttamente da BlobKey.

risposta

6

La maggior parte dei metodi presenti nell'immagine generano attualmente UnsupportedOperationException. Quindi ho utilizzato com.google.appengine.api.blobstore.BlobstoreInputStream.BlobstoreInputStream per manipolare i dati da blobKey. In questo modo posso ottenere larghezza e altezza dell'immagine.

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

Se è possibile utilizzare Guava, l'implementazione è più facile da seguire:

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

Il resto rimane la stessa.

0

Un'altra possibilità è quella di effettuare una trasformazione inutile sull'immagine (come rotazione da 0 gradi)

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

Dopo che la trasformazione, si può ottenere la larghezza & altezza dell'immagine come previsto:

oldImage.getWidth(); 

Anche se funziona, questa trasformazione influisce negativamente sulle prestazioni;)