下载图像并调整大小以避免 OOM 错误,Picasso fit() 会扭曲图像

Download image and resize to avoid OOM errors, Picasso fit() distorts image

我正在尝试以全屏视图显示图像并使用以下代码:

// Target to write the image to local storage.
Target target = new Target() {
   // Target implementation.
}

// (1) Download and save the image locally.
Picasso.with(context)
       .load(url)
       .into(target);

// (2) Use the cached version of the image and load the ImageView.
Picasso.with(context)
       .load(url)
       .into(imgDisplay);

此代码在较新的手机上运行良好,但在具有 32MB VM 的手机上,我遇到了内存不足的问题。所以我尝试将 (2) 更改为:

    Picasso.with(context)
       .load(url)
       .fit()
       .into(imgDisplay);

这导致图像失真。因为在下载图像之前我不知道图像的尺寸,所以我无法设置 ImageView 尺寸,因此图像正在调整大小而不考虑我的 ImageView 中的纵横比:

    <ImageView
    android:id="@+id/imgDisplay"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="fitCenter"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

处理这种情况的最佳方法是什么?我的原始图像的最大宽度为 768,高度为 1024,我想在屏幕比这小得多时进行缩减采样。如果我尝试使用 resize(),我的代码会变得复杂,因为我必须等待 (1) 完成下载,然后在 (2) 中添加 resize()

我假设转换在这种情况下没有帮助,因为 public Bitmap transform(Bitmap source) 的输入已经有大位图,这将导致我 运行 内存不足。

您可以将 fit()centerCrop()centerInside() 结合使用,具体取决于您希望图像如何适合您的 View:

Picasso.with(context)
   .load(url)
   .fit()
   .centerCrop()
   .into(imgDisplay);

Picasso.with(context)
   .load(url)
   .fit()
   .centerInside()
   .into(imgDisplay);