2012-07-25 23 views
5

Tôi cần truy xuất chiều cao và chiều rộng của hình ảnh được tải lên bằng App Engine BlobStore. Cho việc tìm kiếm mà tôi sử dụng đoạn mã sau:Lỗi: java.lang.UnsupportedOperationException: Không có dữ liệu hình ảnh nào khi sử dụng BlobStore của App Engine và API hình ảnh

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

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

     } 

tôi có thể tải lên các hình ảnh và tạo ra các BlobKey nhưng khi vượt qua Blobkey để makeImageFromBlob(), nó tạo ra các lỗi sau:

java.lang.UnsupportedOperationException: No image data is available

Làm thế nào để giải quyết vấn đề này hoặc bất kỳ cách nào khác để tìm chiều cao và chiều rộng hình ảnh trực tiếp từ BlobKey.

Trả lời

6

Hầu hết các phương pháp trên chính Hình ảnh hiện sẽ ném UnsupportedOperationException. Vì vậy, tôi đã sử dụng com.google.appengine.api.blobstore.BlobstoreInputStream.BlobstoreInputStream để thao tác dữ liệu từ blobKey. Đó là cách tôi có thể nhận được chiều rộng và chiều cao hình ảnh.

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

Nếu bạn có thể sử dụng ổi, việc thực hiện dễ dàng hơn để làm theo:

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

Phần còn lại vẫn giữ nguyên.

0

Một khả năng khác là để thực hiện một chuyển đổi vô dụng vào hình ảnh (như quay bằng 0 độ)

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

Sau khi chuyển đổi đó, bạn có thể nhận được chiều rộng & chiều cao của hình ảnh như mong đợi:

oldImage.getWidth(); 

Ngay cả khi điều này hoạt động, phép biến đổi này ảnh hưởng tiêu cực đến hiệu suất;)

Các vấn đề liên quan