6

我需要使用 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 查找图像高度和宽度。

4

3 回答 3

7

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;

}
于 2012-07-26T05:49:23.480 回答
4

如果您可以使用 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);
    }
}

其余的保持不变。

于 2012-09-18T08:47:57.810 回答
0

另一种可能性是对图像进行无用的转换(如旋转 0 度)

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

转换后,您可能会按预期获得图像的宽度和高度:

oldImage.getWidth();

即使这样有效,这种转换也会对性能产生负面影响;)

于 2016-10-14T08:38:10.790 回答