使用毕加索将图像调整为全宽和固定高度

我有一个垂直的LinearLayout,其中的一个项目是使用毕加索加载的ImageView 。 我需要将图像的宽度上升到完整的设备宽度,并显示按固定高度(150dp)裁剪的图像的中心部分。 我目前有以下代码:

 Picasso.with(getActivity()) .load(imageUrl) .placeholder(R.drawable.placeholder) .error(R.drawable.error) .resize(screenWidth, imageHeight) .centerInside() .into(imageView); 

我应该把哪个值放入screenWidthimageHeight (= 150dp)?

您正在寻找:

 .fit().centerCrop() 

这是什么意思:

  • fit – 等待ImageView被测量并调整图像大小以匹配其大小。
  • centerCrop – 缩放宽高比的图像,直到填充大小。 裁剪顶部和底部,或者左右,以便完全匹配尺寸。

使用resize(x,y)调整图像大小如果您的服务器或API以您所需的确切尺寸提供图像,这通常是最佳select,这是在带宽,内存消耗和图像质量之间的完美平衡。

不幸的是,在完美的尺寸下请求图像并不总是在你的掌控之中。 如果图像的尺寸很奇怪,可以使用resize(horizo​​ntalSize,verticalSize)调用将图像的尺寸更改为更合适的尺寸。 这将在ImageView中显示图像之前调整图像大小。

 Picasso .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .resize(600, 200) // resizes the image to these dimensions (in pixel). does not respect aspect ratio .into(imageViewResize); 

使用scaleDown()当使用resize()选项时,毕加索也会提升你的形象。 由于在不改善图像质量的情况下制作较大的图像可能会浪费计算时间,因此调用scaleDown(true)仅在原始图像的尺寸大于目标尺寸时应用resize()。

 Picasso .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .resize(6000, 2000) .onlyScaleDown() // the image will only be resized if it's bigger than 6000x2000 pixels. .into(imageViewResizeScaleDown); 

缩放缩小图像现在,与任何image processing一样,调整图像大小可能会扭曲长宽比,并使图像显示变丑。 在大多数情况下,您想要防止这种情况发生。 毕加索给你两个缓解的select,无论是呼叫centerCrop()还是centerInside()。

CenterCrop

CenterCrop()是一种裁剪技术,可以缩放图像,以便填充ImageView的请求边界,然后裁剪额外的图像。 ImageView将被完全填充,但整个图像可能不会显示。

 Picasso .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .resize(600, 200) // resizes the image to these dimensions (in pixel) .centerCrop() .into(imageViewResizeCenterCrop); 

CenterInside

CenterInside()是一种裁剪技术,可缩放图像,使两个尺寸等于或小于ImageView的请求边界。 图像将完整显示,但可能不会填满整个ImageView。

 Picasso .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .resize(600, 200) .centerInside() .into(imageViewResizeCenterInside); 

最后但并非最不重要的是:毕加索的适合()所讨论的选项应该涵盖您对图像大小调整和缩放function的需求。 毕加索还有一个帮助器function,它可以是非常有用的:fit()。

 Picasso .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .fit() // call .centerInside() or .centerCrop() to avoid a stretched image .into(imageViewFit); 

fit()是测量目标ImageView的尺寸,并在内部使用resize()将图像尺寸缩小为ImageView的尺寸。 有两件事情要知道fit()。 首先,调用fit()可以延迟图像请求,因为毕加索需要等待ImageView的大小才能被测量。 其次,你只能使用fit()和ImageView作为目标(我们稍后会看到其他目标)。

优点是图像处于尽可能低的分辨率,而不会影响其质量。 分辨率越低意味着caching中的数据量越less。 这可以显着减less应用程序的内存占用中的图像的影响。 总而言之,如果您更喜欢较短的加载时间,更低的内存影响,fit()是一个很好的工具。