2012-07-25 4 views
5

Potrzebuję pobrać wysokość i szerokość przesłanego obrazu za pomocą App BlobStore App Engine. Dla stwierdzenia, że ​​użyłem poniższy kod:Błąd: java.lang.UnsupportedOperationException: Brak danych obrazu przy korzystaniu z App BlobStore i Image API

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

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

     } 

mogę przesłać obraz i wygenerować BlobKey ale kiedy przechodzą Blobkey do makeImageFromBlob() wygeneruje następujący błąd:

java.lang.UnsupportedOperationException: No image data is available

Jak rozwiązać ten problem lub w inny sposób znaleźć wysokość i szerokość obrazu bezpośrednio z BlobKey.

Odpowiedz

6

Większość metod na samym obrazie powoduje obecnie wyjątek UnsupportedOperationException. Użyłem więc com.google.appengine.api.blobstore.BlobstoreInputStream.BlobstoreInputStream do manipulowania danymi z blobKey. W ten sposób mogę uzyskać szerokość i wysokość obrazu.

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

Jeśli można użyć guawy, wdrożenie jest łatwiejsze do naśladowania:

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

Reszta pozostaje taka sama.

0

Inną możliwością jest, aby bezużyteczną przemianę na obraz (jak obracanie przez 0 stopni)

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

Po tej transformacji, można uzyskać szerokość & wysokość obrazu zgodnie z oczekiwaniami:

oldImage.getWidth(); 

Nawet jeśli to działa, transformacja ta ma negatywny wpływ na wydajność;)