Ответ 1
Я нашел решение..
В моем объекте Transform мне понадобилось масштабировать изображение (поддерживая соотношение сторон) до макс. 1024 x 768.
Объект Transform никогда не вызывался, если я не позвоню .resize(width, height)
, чтобы выполнить повторный выбор изображения.
Для сохранения соотношения сторон и изменения размера я вызываю .centerInside()
. Таким образом, изображение будет масштабироваться по мере увеличения ширины, высоты).
Значение, которое я выдаю .resize(ширина, высота), Math.ceil(Math.sqrt(1024 * 768))
.
Таким образом, у меня наверняка будет изображение, достаточно высокое для моего настраиваемого объекта Transform, а также исключение Out Of Memory
Обновление: полный пример
Следуя этому примеру, вы получите изображение, которое соответствует границам MAX_WIDTH и MAX_HEIGHT (сохраняя пропорции)
private static final int MAX_WIDTH = 1024;
private static final int MAX_HEIGHT = 768;
int size = (int) Math.ceil(Math.sqrt(MAX_WIDTH * MAX_HEIGHT));
// Loads given image
Picasso.with(imageView.getContext())
.load(imagePath)
.transform(new BitmapTransform(MAX_WIDTH, MAX_HEIGHT))
.skipMemoryCache()
.resize(size, size)
.centerInside()
.into(imageView);
И это мой собственный класс BitmapTransform:
import android.graphics.Bitmap;
import com.squareup.picasso.Transformation;
/**
* Transformate the loaded image to avoid OutOfMemoryException
*/
public class BitmapTransform implements Transformation {
private final int maxWidth;
private final int maxHeight;
public BitmapTransform(int maxWidth, int maxHeight) {
this.maxWidth = maxWidth;
this.maxHeight = maxHeight;
}
@Override
public Bitmap transform(Bitmap source) {
int targetWidth, targetHeight;
double aspectRatio;
if (source.getWidth() > source.getHeight()) {
targetWidth = maxWidth;
aspectRatio = (double) source.getHeight() / (double) source.getWidth();
targetHeight = (int) (targetWidth * aspectRatio);
} else {
targetHeight = maxHeight;
aspectRatio = (double) source.getWidth() / (double) source.getHeight();
targetWidth = (int) (targetHeight * aspectRatio);
}
Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
if (result != source) {
source.recycle();
}
return result;
}
@Override
public String key() {
return maxWidth + "x" + maxHeight;
}
}