Ошибка: java.lang.UnsupportedOperationException: данные изображения недоступны при использовании BlobStore App Engine и API изображений.

Мне нужно получить высоту и ширину загруженного изображения с помощью App Engine BlobStore. Чтобы узнать, что я использовал следующий код:

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

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

        }

я могу загрузить изображение и сгенерировать BlobKey, но при передаче Blobkey в makeImageFromBlob() возникает следующая ошибка:

java.lang.UnsupportedOperationException: данные изображения недоступны

Как решить эту проблему или любой другой способ узнать высоту и ширину изображения непосредственно из BlobKey.


person Master Mind    schedule 25.07.2012    source источник


Ответы (3)


Большинство методов самого изображения в настоящее время вызывают исключение 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;

}
person Master Mind    schedule 26.07.2012

Если вы можете использовать Guava, реализация будет проще:

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

Остальное остается прежним.

person Nacho Coloma    schedule 18.09.2012

Другая возможность - сделать бесполезное преобразование изображения (поворот на 0 градусов)

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

После этого преобразования вы можете получить ширину и высоту изображения, как и ожидалось:

oldImage.getWidth();

Даже если это работает, это преобразование отрицательно влияет на производительность ;)

person Jokus    schedule 14.10.2016