毕加索 - 如何获得真实的图像尺寸?

时间:2016-05-21 14:43:31

标签: android image bitmap picasso android-bitmap

我从URL使用Picasso库加载图像。我想获得真实的图像大小,但我只能在内存中获得图像大小:

Picasso.with(this)
    .load(imageUrl)
    .error(R.drawable.no_image)
    .into(photoView, new Callback() {
        @Override
        public void onSuccess() {
            Bitmap bitmap = ((BitmapDrawable)photoView.getDrawable()).getBitmap();
            textImageDetail.setText(bitmap.getByteCount());// image size on memory, not actual size of the file
        }

        @Override
        public void onError() { }
    });

如何获取加载图像的大小?我认为它存储在缓存中的某个地方,但我不知道如何访问图像文件。

更新

抱歉我的英语不好,也许我问了错误的问题。我需要获得图像大小(128 kb,2 MB等)。 图像分辨率(800x600等)

2 个答案:

答案 0 :(得分:2)

您可以先获取正在加载的实际Bitmap图像,然后找到该图像的尺寸。这必须在AsyncTask之类的异步方法中运行,因为下载图像是同步的。这是一个例子:

Bitmap downloadedImage = Picasso.with(this).load(imageUrl).get();
int width = downloadedImage.getWidth();
int height = downloadedImage.getHeight();

如果您想获得Bitmap的实际图像大小(以字节为单位),请使用

// In bytes
int bitmapSize = downloadedImage.getByteCount();
// In kilobytes
double kbBitmapSize = downloadedImage.getByteCount() / 1000;

imageUrl替换为您要使用的任何网址。希望它有所帮助!

答案 1 :(得分:0)

我知道这个问题很老,但我来这里寻找答案却没有找到。

我找到了一个使用 OkHttpClient 的解决方案。

您可以只获取标题信息,使用 OkHttpClient 并获取内容长度无需下载图像。

OkHttpClient httpClient = new OkHttpClient();

Request request = new Request.Builder().url(imageURL).head().build();
Response response = null;

try {
    response = httpClient.newCall(request).execute();
    String contentLength = response.header("content-length");
    int size = Integer.parseInt(contentLength);
} catch (IOException e ) {
    if (response!=null) {
        response.close();
    }
}

注意事项:

  • 以上代码执行网络调用,应在后台线程上执行。
  • 大小以字节为单位返回,如果需要以KB为单位,可以除以1000。
  • 这可能不适用于大文件。
  • 请注意,转换为整数可能会绕过整数的最大值。