我使用Picasso在我的应用程序中显示图像。在某些情况下,收到的图像非常大,在这种情况下,我想调整图像大小,从现在开始使用调整大小的图像。
我正在使用以下Picasso方法来接收位图图像:
articleVH.mTarget = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if(bitmap != null) {
articleVH.mCoverImage.setImageBitmap(Utils.getResizedBitmapIfNeeded(bitmap));
} else {
mTimelineViewCallback.getArticleImage(articleCoverData);
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
mTimelineViewCallback.getArticleImage(articleCoverData);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {}
};
现在我希望在Utils.getResizedBitmapIfNeeded(bitmap)
调整图像大小的情况下,我想在下次请求时使用这个已调整大小的图像。
如何在不使用resize(int,int)选项的情况下完成此操作,我知道该选项正在缓存图像,但我无法使用它。
答案 0 :(得分:1)
你可以试试这个:
Picasso
.with(context)
.load(your_image)
.resize(4000, 2000)
.onlyScaleDown() // the image will only be resized if it's bigger than 4000x2000 pixels.
.into(your_image_view);
答案 1 :(得分:0)
我想做的一种方法如下:
articleVH.mTarget = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if(bitmap != null) {
int[] resizedImageSize = Utils.getResizedImageSize(bitmap);
if (bitmap.getHeight() == resizedImageSize[0] && bitmap.getWidth() == resizedImageSize[1]) {
mPicasso.load(articleCoverData.mImageUrl).into(articleVH.mCoverImage);
} else {
mPicasso.load(articleCoverData.mImageUrl).resize(resizedImageSize[1], resizedImageSize[0]).into(articleVH.mCoverImage);
}
} else {
mTimelineViewCallback.getArticleImage(articleCoverData);
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
mTimelineViewCallback.getArticleImage(articleCoverData);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {}
}
getResizedImageSize
的位置:
public static int[] getResizedImageSize(@NonNull Bitmap originalBitmap) {
int bitmapHeight = originalBitmap.getHeight();
int bitmapWidth = originalBitmap.getWidth();
int[] originalSize = {bitmapHeight, bitmapWidth};
if (!(bitmapHeight > Constants.IMAGE_EDGE_SIZE_LIMIT && bitmapWidth > Constants.IMAGE_EDGE_SIZE_LIMIT)){
return originalSize;
}
if (BuildConfig.DEBUG) {
Log.e(TAG, "Original Bitmap: Height: " + bitmapHeight + " Width: " + bitmapWidth);
}
float ratio = bitmapHeight / Constants.IMAGE_EDGE_SIZE_LIMIT;
bitmapHeight = Constants.IMAGE_EDGE_SIZE_LIMIT;
bitmapWidth = (int) (bitmapWidth * (1 / ratio));
int[] newSize = {bitmapHeight, bitmapWidth};
return newSize;
}
请记住,这意味着图像将被加载两次。一旦这样你就可以得到它的大小,第二次调整大小并将这个图像存储到调整后的缓存中。