2012-07-25 33 views
5

我需要使用App Engine BlobStore檢索上傳圖像的高度和寬度。對於發現我用下面的代碼:錯誤:java.lang.UnsupportedOperationException:使用App Engine的BlobStore和圖像API時沒有圖像數據可用

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

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

     } 

我可以上傳圖像和生成的BlobKey,但通過的blobKey到makeImageFromBlob()時,它會生成以下錯誤:

java.lang.UnsupportedOperationException: No image data is available

如何解決這個問題或任何其他方式直接從BlobKey查找圖像的高度和寬度。

回答

6

Image本身上的大多數方法當前都會拋出UnsupportedOperationException異常。 所以我用com.google.appengine.api.blobstore.BlobstoreInputStream.BlobstoreInputStream來處理blobKey中的數據。這是我可以得到圖像的寬度和高度。

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

如果你可以使用番石榴,實施更容易遵循:

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

的其餘部分保持不變。

0

另一種可能性是,使圖像上的無用的轉變(由0度旋轉)

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

,改造後,你可能會得到寬度&高度圖像的預期:

oldImage.getWidth(); 

即使這樣起作用,這種轉換也會對性能造成不利影響;)

相關問題